2017-02-14 31 views
10

Tôi đang cố gắng thu thập vào một ListMultiMap sử dụng java 8 mà không cần sử dụng thao tác forEach.Thu thập vào ListMultiMap của ổi bằng cách sử dụng Java 8 suối

Nếu tôi được viết mã trong Java 7, nó sẽ là một cái gì đó như thế này:

ListMultimap<String, String> result = ArrayListMultimap.create(); 
    for(State state: states) { 
     for(City city: state.getCities()) { 
     result.put(state.getName(), city.getName()); 
     } 
    } 

Tôi tìm thấy trực tuyến một website rằng cuộc đàm phán về việc tạo nhà sưu tập của riêng bạn để sử dụng trong các tình huống như thế này. Tôi đã sử dụng cài đặt này cho trình thu thập. Sau đó tôi đã viết mã sau đây:

 ListMultimap<String, String> result = states 
     .stream() 
     .flatMap(state -> state.getCities().stream() 
      .map(city -> { 
       return new Pair(state, city); 
      })) 
     .map(pair -> { 
      return new Pair(pair.first().getName(), pair.second().getName())); 
     }) 
     .collect(MultiMapCollectors.listMultimap(
        Pair::first, 
        Pair::second 
       ) 
     ); 

Nhưng ở mức thu thập, tôi chỉ có thể chuyển một tham số và tôi có thể tìm cách chuyển hai tham số. Tiếp theo ví dụ từ trang web, tôi hiểu rằng để sử dụng cả hai, tôi cần phải lưu trữ một "cặp" trong Multimap như sau:

ArrayListMultimap<String, Pair> testMap = testObjectList.stream().collect(MultiMapCollectors.listMultimap((Pair p) -> p.first().getName())); 

Tuy nhiên đây không phải là những gì tôi đang tìm kiếm, tôi muốn thu thập vào ListMultimap bằng cách sử dụng tên của tiểu bang và tên của thành phố bằng cách sử dụng bộ sưu tập của java 8 (và không có forEach).

Ai đó có thể giúp tôi với điều đó không? Cảm ơn bạn!

+2

Mã phía sau liên kết đó trông không rõ ràng; Các loại thô, phôi được bỏ chọn và biến loại không cần thiết cho bộ tích lũy. –

+0

Bạn đã đúng! Cảm ơn bạn đã chỉ ra rằng ! Tôi nghĩ rằng đó là âm thanh vì tôi đã tìm thấy rất nhiều trang web khác có triển khai tương tự. Cảm ơn bạn ! – codastic

Trả lời

1

Bạn thể tạo ra một nhà sưu tập tùy chỉnh cho lệnh này (lưu ý rằng câu trả lời Louis Wasserman sẽ làm một forEachOrdered nội bộ, bạn có thể không thực sự thoát khỏi một foreach bên trong hoặc bên ngoài).

ListMultimap<String, String> list = states.collect(Collector.of(ArrayListMultimap::create, (multimap, s) -> { 
     multimap.putAll(s.getName(), s.getCities().stream().map(City::getName).collect(Collectors.toList())); 
    }, (multi1, multi2) -> { 
     multi1.putAll(multi2); 
     return multi1; 
    })); 
+0

Cảm ơn bạn! Tôi đã tìm kiếm một cái gì đó tương tự như câu trả lời của Louis Wasserman, nhưng bạn đã cho tôi một ý tưởng khá tốt đẹp mà tôi cần cho một cái gì đó khác bằng cách nói "Bạn có thể tạo một nhà sưu tập tùy chỉnh". – codastic

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