Why is the abbreviation combiner function not performed?

I am new to Java 8. I am learning the reduce API thread. I see strange behavior with this code:

 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); } } 

Output:

 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] 

My question is why the combiner function does not fulfill the value, why this line:

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

... not running?

+7
java java-8 java-stream
source share
1 answer

This is because you are not using parallelStream() .

A combiner is called only for parallel flow.

But this is not the only problem in your code, reduce is supposed to work with immutable data - your code, as it is now, will fail for a parallel thread. This will work for collect , but to reduce you need to change it to:

  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; }); 
+9
source share

All Articles