2017-08-30 14 views
7

Tôi mới sử dụng Java 8. Tôi đang học phương pháp của phương pháp reduce của API. Tôi nhìn thấy một hành vi kỳ lạ với mã này:Tại sao chức năng kết hợp giảm không được thực thi?

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] 

Câu hỏi của tôi là lý do tại sao chức năng bộ kết hợp không thực hiện nghĩa tại sao dòng này:

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

.. . không được thực thi?

Trả lời

9

Đó là vì bạn không sử dụng số parallelStream().

A combinerchỉ được gọi cho một luồng song song.

Nhưng đó không phải là vấn đề duy nhất trong mã của bạn, reduce được giả sử làm việc với bất biến dữ liệu - mã của bạn, theo cách hiện tại, sẽ không thành công cho luồng song song. này sẽ làm việc cho collect, nhưng đối với reduce bạn cần phải thay đổi nó thành:

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

Nhờ có nó !. – vicky

+2

Trả lời câu trả lời của bạn một chút để làm cho nó rõ ràng hơn. Bạn biết cách hoàn tác trong trường hợp bạn không thích những thay đổi của tôi, tôi đoán vậy. – GhostCat

Các vấn đề liên quan