Java 8文件readAlllines map和reduce

时间:2016-11-17 09:37:57

标签: java-8

我有/ 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

2 个答案:

答案 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();