为什么不执行reduce combiner功能?

时间:2017-08-30 08:34:56

标签: java java-8 java-stream

我是Java 8的新手。我正在学习stream API的reduce方法。我看到这段代码有一种奇怪的行为:

public class PrdefinedCollectors {
    public static void main(String[] args) {
        Stream<Integer> stream = Stream.of(1, 2, 3, 4, 5, 6);
        List<Integer> dataHolder = new ArrayList<Integer>();
        List<Integer> numbers = stream.reduce(dataHolder, 
            (List<Integer> dataStore, Integer data) -> {
                    System.out.println(data + " ->: " + dataStore);
                    dataStore.add(data);
                    return dataStore;
                },
            (List<Integer> listOne, List<Integer> listTwo) -> {
                    System.out.println("ListOne Data :" + listOne + " List Two data :" + listTwo);
                    listOne.addAll(listTwo);
                    return listOne;
                });

        System.out.println(numbers);
    }
}

输出:

1 ->: []
2 ->: [1]
3 ->: [1, 2]
4 ->: [1, 2, 3]
5 ->: [1, 2, 3, 4]
6 ->: [1, 2, 3, 4, 5]
[1, 2, 3, 4, 5, 6]

我的问题是为什么组合器功能没有执行意义为什么这一行:

System.out.println("List One Data: " + listOne + " List Two data: " + listTwo);

......没有被执行?

1 个答案:

答案 0 :(得分:9)

这是因为您没有使用parallelStream()

combiner仅为 调用并行流。

但这不是代码中唯一的问题,reduce假设使用不可变数据 - 您的代码(现在的方式)将会因并行流而失败。此适用于collect,但对于reduce,您需要将其更改为:

 List<Integer> numbers = stream
            .parallel()
            .reduce(
                    new ArrayList<>(),
                    (list, data) -> {
                        ArrayList<Integer> newList = new ArrayList<>(list);
                        newList.add(data);
                        return newList;
                    },

                    (left, right) -> {
                        ArrayList<Integer> newList = new ArrayList<>(left);
                        newList.addAll(right);
                        return newList;
                    });