将流<String>转换为字符串<Record>将返回 void



我正在尝试编写一个程序,该程序将转换流<字符串>转换为字符串<记录>每当字符串中有逗号时,它都会将数据放入数据的一个部分。我做这件事的第一个想法是像这样使用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

最新更新