5 回答

TA貢獻1942條經(jīng)驗 獲得超3個贊
您應(yīng)該使用map
order 將每個數(shù)組映射到相應(yīng)的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
(即使默認實現(xiàn)確實 return ArrayList
,你也不能指望它)。

TA貢獻1780條經(jīng)驗 獲得超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條經(jīng)驗 獲得超9個贊
我建議向您的 person 類添加一個靜態(tài)方法(或根據(jù)構(gòu)造函數(shù))來解析 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()。使用您可以使用的所有內(nèi)容來創(chuàng)建您List<Person>:
try (Stream<String> lines = Files.lines(Paths.get("./person.txt"))) {
List<Person> persons = lines
.map(Person::fromCSV)
.collect(Collectors.toList());
}

TA貢獻1865條經(jīng)驗 獲得超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條經(jīng)驗 獲得超6個贊
您所做的是正確的,唯一缺少的是您在 collect 中創(chuàng)建了 Person 對象,而不是您可以在 map 方法本身內(nèi)部創(chuàng)建它并返回它,并將 collect 方法與 Collectors.toList() 方法一起使用。下面的代碼片段將很好地理解我要傳達的內(nèi)容:
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 轉(zhuǎn)換為 ArrayList,但我認為 List 應(yīng)該適合您的操作。
添加回答
舉報