我正在尝试编写一个程序,该程序将转换流<字符串>转换为字符串<记录>每当字符串中有逗号时,它都会将数据放入数据的一个部分。我做这件事的第一个想法是像这样使用split((:
return fileToStream("data.csv").forEach(s -> s.split(","));
fileToStream函数只需获取data.csv并将其转换为Stream我不太明白为什么这会返回虚空,任何帮助都将不胜感激。
我原以为它需要123,你好,你好,123123之类的东西,而不是全部是一个字符串,把它变成int,string,string,字符串,double,double等的记录。
forEach
不返回任何内容(声明为public void forEach(Consumer<? super T> action)
(。您想使用Stream#map
代替:
返回一个流,该流由将给定函数应用到此流的元素的结果组成。
但是,s.split
将返回一个字符串数组(String[]
(,而不是任何类型的记录。如果您想要一个类的实例,您需要构造它们,例如使用new Record(s.split(","))
或Record.fromArray(s.split(","))
记录构造函数/工厂然后可以解析数组:
public static Record fromArray(final String[] array) {
return new Record(
Integer.parseInt(array[0]),
array[1],
array[2],
array[3],
Double.parseDouble(array[4]),
Double.parseDouble(array[5]));
}
但是,由于您正在解析CSV文件,因此最好使用诸如opencsv之类的CSV解析器。
假设fileToStream将CSV的每个记录作为流返回,那么您想要做的可能是映射到一个记录,然后收集结果。
Foreach只像迭代器一样在Collection中循环,不返回任何内容。
fileToStream("data.csv").forEach(s -> s.split(","));
相当于:
for(String s : fileToStream("data.csv")) {
s.split(","); // note that you are splitting and ignoring the return result
}
(事实上,这有点不同,因为流使用默认迭代器,集合迭代器将使用集合的forEach方法,但在本用例中,我们现在可以忽略这一事实,本用例中的结果是相同的(
return fileToStream("data.csv").forEach(s -> s.split(","))
.map(***your conversion logic***).collect(Collectors.toList()); //or toList() depending on your Java version