2017-11-04 31 views
5

Tôi đang học cách sử dụng các luồng Java và cần một số trợ giúp để hiểu cách truyền các bộ sưu tập lồng nhau và thu thập kết quả trở lại vào bộ sưu tập.Luồng Java: Thu thập bộ sưu tập lồng nhau

Trong ví dụ đơn giản dưới đây, tôi đã tạo 2 ArrayLists và thêm chúng vào một ArrayList. Tôi muốn có thể thực hiện một chức năng đơn giản trên mỗi bộ sưu tập lồng nhau và sau đó chụp các kết quả vào một bộ sưu tập mới. Dòng mã cuối cùng thậm chí không biên dịch. Mọi lời giải thích sẽ được đánh giá cao!

ArrayList<Integer> list1 = new ArrayList<Integer>(Arrays.asList(1,2,3)); 
    ArrayList<Integer> list2 = new ArrayList<Integer>(Arrays.asList(4,5,6)); 

    ArrayList<ArrayList<Integer>> nested = new ArrayList<ArrayList<Integer>>(); 
    nested.add(list1); 
    nested.add(list2); 

    ArrayList<ArrayList<Integer>> result = nested.stream() 
      .map(list -> list.add(100)) 
      .collect(Collectors.toList()); 
+0

Chính xác bạn muốn gì? 'Nested.stream()' của bạn sẽ trả về một 'Dòng >' để bạn có thể vận hành mỗi danh sách lồng nhau như mong đợi. Hay bạn cần phải làm phẳng nó vào 'Stream 'để bạn có thể vận hành trên mỗi phần tử của danh sách lồng nhau? –

+0

Collectors.toList() được sử dụng để tạo Danh sách. Không phải là một ArrayList. Chương trình giao diện, không triển khai. Ngoài ra, bạn không nên thay đổi các yếu tố mà bạn đang lặp lại bằng luồng. Đó không phải là những gì được cho. –

+0

Phương thức thêm 'List' có kiểu trả về' boolean' do đó bằng cách viết '.map (list -> list.add (100))' sẽ trả về 'Stream ' –

Trả lời

1

Vấn đề là List#add không trả lại List. Thay vào đó, bạn cần phải trả lại danh sách sau khi ánh xạ:

List<ArrayList<Integer>> result = nested.stream() 
     .map(list -> { 
      list.add(100); 
      return list; 
     }) 
     .collect(Collectors.toList()); 

Hoặc bạn có thể bỏ qua bằng map và làm điều đó bằng forEach, vì ArrayList là có thể thay đổi:

nested.forEach(list -> list.add(100)); 
0

Bạn có thể sử dụng Stream.of() để làm điều này , mà không tạo ra sự che chắn lồng nhau trước.

 List<ArrayList<Integer>> nestedList = Stream.of(list1, list2) 
      .map(list -> {list.add(100); return list;}) 
      .collect(Collectors.toList()); 

Và có thể trích xuất hoạt động bản đồ thành một chức năng riêng biệt.

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