5 回答
TA贡献1942条经验 获得超3个赞
您应该使用map
order 将每个数组映射到相应的Person
实例:
al = br.lines().map(s -> s.split(",")) .map (a -> new Person(a[0],a[1],Integer.valueOf(a[2]),Integer.valueOf(a[3]))) .collect(Collectors.toList());
顺便说一句,Collectors.toList()
返回 a List
,而不是 an ArrayList
(即使默认实现确实 return ArrayList
,你也不能指望它)。
TA贡献1780条经验 获得超5个赞
在尝试之前,您需要先将map
其添加到对象中:Person
collect
.map(s -> s.split(",")) .map(a -> new Person(a[0],a[1],Integer.valueOf(a[2]),Integer.valueOf(a[3])) //here .collect(Collectors.toList())
TA贡献1830条经验 获得超9个赞
我建议向您的 person 类添加一个静态方法(或根据构造函数)来解析 CSV 字符串:
public static Person fromCSV(String csv) {
String[] parts = csv.split(",");
if (parts.length != 4) {
throw new IllegalArgumentException("csv has not 4 parts");
}
return new Person(parts[0], parts[1], Integer.parseInt(parts[2]), Integer.parseInt(parts[3]));
}
要阅读您可以选择使用的行Files.lines()。使用您可以使用的所有内容来创建您List<Person>:
try (Stream<String> lines = Files.lines(Paths.get("./person.txt"))) {
List<Person> persons = lines
.map(Person::fromCSV)
.collect(Collectors.toList());
}
TA贡献1865条经验 获得超7个赞
为什么要映射两次?你可以直接这样做,
.map(s -> {
String[] parts = s.split(",");
return new Person(parts[0],parts[1],Integer.valueOf(parts[2]),Integer.valueOf(parts[3]));
}).collect(Collectors.toList());
TA贡献1797条经验 获得超6个赞
您所做的是正确的,唯一缺少的是您在 collect 中创建了 Person 对象,而不是您可以在 map 方法本身内部创建它并返回它,并将 collect 方法与 Collectors.toList() 方法一起使用。下面的代码片段将很好地理解我要传达的内容:
al= br.lines()
.map(s -> {
String[] subStrings = s.split(",");
return new Person(subStrings[0], subStrings[1], Integer.valueOf(subStrings[2]), Integer.valueOf(subStrings[3]));
})
.collect(Collectors.toList());
这样您只使用一次 map 方法,并返回 collect 方法合并到 List 中所需的对象。如果您希望它成为 ArrayList,您可以使用 Collections 框架将 List 转换为 ArrayList,但我认为 List 应该适合您的操作。
添加回答
举报