Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将带分隔符的字符串映射到字符串列表或新对象_Java_Java 8_Java Stream - Fatal编程技术网

Java 将带分隔符的字符串映射到字符串列表或新对象

Java 将带分隔符的字符串映射到字符串列表或新对象,java,java-8,java-stream,Java,Java 8,Java Stream,我有一个文件,其中有些数据用分号分隔。我正在尝试构建一个流,它将逐行读取文件,分离每一列数据并将其映射到新对象 data.txt: John;Smith;42;shopassistant Clara;Lefleur;24;programmer Person.class: public class Person{ String name; String lastName; int age; String job; } 我是这样开始的: List<Person>

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

data.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"))....
List people=Files.line(path.get(“src/data.txt”))。。。。

有什么想法吗?

你可以像这样使用地图:

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

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());
Pattern p=Pattern.compile(“^(\\w+);(\\w+);(\\w+);(\\w+$”,Pattern.MULTILINE);
列表人员=新扫描仪(path.get(“src/data.txt”))
芬德尔先生(p)
.map(mr->newperson(mr.group(1)、mr.group(2)、Integer.valueOf(mr.group(3))、mr.group(4)))
.collect(Collectors.toList());

Great solution的可能副本。我不知道流在.map方法之后的行为,也没有发现我可以使用它两次。谢谢。欢迎使用@steve1337,因为map返回一个
,所以您可以使用另一个map,依此类推on@YCF_L@Eugene是的,如果用户使用Java-9+,但我喜欢使用
文件
,因为我可以使用
takeWhile
dropWhile
和许多其他更好的工具+1 anyway@YCF_L顺便说一句,你很幸运有一个字符正则表达式,否则,
模式
应该在流本身之外采取……它更符合标准吗?@steve1337您的意思是什么?在(比如)代码审查期间,您希望看到哪种解决方案?@steve1337显然是这样。一个
扫描器
就是这个开始的工具。
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());