【问题标题】:Mapping String with delimiters to list of strings or to new object将带分隔符的字符串映射到字符串列表或新对象
【发布时间】:2019-01-31 05:43:08
【问题描述】:

我有一个文件,其中包含一些用分号分隔的数据。我正在尝试构建一个流,它将逐行读取文件,分离每一列数据并将其映射到新对象。

数据.txt:

John;Smith;42;shopassistant
Clara;Lefleur;24;programmer

Person.class:

public class Person{
   String name;
   String lastName;
   int age;
   String job;
}

我是这样开始的:

List<Person> people = Files.lines(Paths.get("src/data.txt"))....

有什么想法吗?

【问题讨论】:

标签: java java-8 java-stream


【解决方案1】:

你可以像这样使用地图:

List<Person> people = Files.lines(Paths.get("src/data.txt"))
        .map(p -> p.split(";"))//split each line with ';'
        .map(p -> new Person(p[0], p[1], Integer.valueOf(p[2]), p[3]))//create a new Person
        .collect(Collectors.toList());//then collect the result

确保您有一个保存该信息的构造函数:

public Person(String name, String lastName, int age, String job) {

【讨论】:

  • 很好的解决方案。我不知道 .map 方法之后流的行为如何,也没有发现我可以使用它两次。谢谢。
  • 不客气@steve1337,因为地图返回一个Stream&lt;R&gt;,所以你可以使用另一个地图,等等
  • @Eugene 是的,如果用户使用 Java-9+,但我喜欢使用 Files,因为我可以使用 takeWhiledropWhile 和许多其他更好的工具 +1 任何方式
  • @YCF_L 顺便说一句,你很幸运在这里有一个 char 正则表达式,否则 Pattern 应该被带到流本身之外......
【解决方案2】:

Scanner 对这项工作更有用,因为java-9 更适合使用:

Pattern p = Pattern.compile("^(\\w+);(\\w+);(\\w+);(\\w+)$", Pattern.MULTILINE);
List<Person> persons = new Scanner(Paths.get("src/data.txt"))
            .findAll(p)
            .map(mr -> new Person(mr.group(1), mr.group(2), Integer.valueOf(mr.group(3)), mr.group(4)))
            .collect(Collectors.toList());

【讨论】:

  • 是否更符合标准?
  • @steve1337 什么意思?
  • 在代码审查期间,您会很高兴看到哪种解决方案?
  • @steve1337 显然是这个。 Scanner 开始的工具。
猜你喜欢
  • 2018-08-06
  • 2021-08-15
  • 2017-05-05
  • 1970-01-01
  • 2012-08-21
  • 2011-03-18
  • 1970-01-01
  • 2010-10-19
  • 2021-11-23
相关资源
最近更新 更多