我有/ 1 /中的文本文件。第一列是产品Volumn,第二列是产品重量。我的目的是计算total_Volumn / total_Weight。早期的Java版本必须读取所有行,然后解析,并循环....,无论如何很多行。但这是由单线程计算的。我想Java 8的功能,比如我们的map,reduce,用这几行来做这个计算。此外,计算效率更高正弦Java8使用多线程任何一个例子?
/ 1 / textData.txt
Volumn Weight
1010.0 3458
34334 322
3434 343
3433 542
3134 146
3393 246
...
9787 3023
答案 0 :(得分:1)
您可以尝试以下方式:
package com.grs.stackOverFlow.pack06;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;
class Data{
private Double volume;
private Double weight;
public Data(String string, String string2) {
setVolumeString(string);
setWeightString(string2);
}
public Double getVolume() {
return volume;
}
public Double getWeight() {
return weight;
}
public void setVolumeString(String volumeStr){
this.volume=Double.valueOf(volumeStr);
}
public void setWeightString(String weightStr){
this.weight=Double.valueOf(weightStr);
}
}
public class FileSummary01 {
public static void main(String[] args) throws IOException {
List<String> lines = Files.readAllLines(Paths.get("src/com/grs/stackOverFlow/pack06/data.txt"));
List<Data> data=lines.stream()
.skip(1)
.map(t->
{ String [] a =t.split("\\s+");
System.out.printf("arr : %s %s %n",a[0],a[1]);
return new Data(a[0],a[1]);}).collect(Collectors.toList());
System.out.println("sum of volume : " + data.stream().mapToDouble(Data::getVolume).sum());
System.out.println("sum of weight : " + data.stream().mapToDouble(Data::getWeight).sum());
}
}
如果您有大数据,可以尝试使用parallelStream而不是stream。
答案 1 :(得分:0)
如果你的目标是在一行中做某事,那么
Files.lines(Paths.get("/path/to/file.txt")).map(line -> line.split("\t")).mapToDouble(vw -> Double.parseDouble(vw[0])/Double.parseDouble(vw[1])).sum();