2017-01-11 15 views
5

У меня есть Stream< Map< K, V > > и я пытаюсь объединить эти карты вместе, но сохраняют одинаковые значения в списке, так что окончательный вид будет Map< K, List<V> >. Есть ли способ сделать это? Я знаю, что коллекционер toMap имеет двоичную функцию, чтобы в основном выбирать, какое значение возвращается, но может ли он отслеживать преобразованный список?Сбор Поток Карта <K,V> к карте <K,List<V>>

т.е.

если a является Stream< Map< String, Int > >

a.flatMap(map -> map.entrySet().stream()).collect(
    Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (val1, val2) -> ?? 
); 

ответ

8

Использование groupingBy: см Javadoc, но в вашем случае это должно быть что-то вроде этого:

a.flatMap(map -> map.entrySet().stream()) 
.collect(
    Collectors.groupingBy(
    Map.Entry::getKey, 
    HashMap::new, 
    Collectors.mapping(Map.Entry::getValue, toList()) 
    ) 
); 

Или:

a.map(Map::entrySet).flatMap(Set::stream) 
.collect(Collectors.groupingBy(
    Map.Entry::getKey, 
    Collectors.mapping(Map.Entry::getValue, toList()) 
    ) 
); 
+3

Вы можете используйте ['groupingBy (Function, Collector)'] (https://docs.oracle.com/javase/8/docs/api/java/util/stream/Collectors.html#groupingBy-java.util.function.Function- java.util.stream.Collector-) и оставить «HashMap :: new'. Кроме того, для тех, кто предпочитает ссылки на методы, вы можете сделать «a.map (Map :: entrySet) .flatMap (Set :: stream)». – shmosel

+0

Спасибо, я отредактировал свой ответ. – NoDataFound

0

Это немного wordier, чем решение groupingBy, но я просто хотел бы отметить, что также можно использовать toMap (как вы изначально намеревались сделать), обеспечивая функцию слияния:

a.flatMap(map -> map.entrySet().stream()).collect(
     Collectors.toMap(Map.Entry::getKey, 
       entry -> { 
        List<Integer> list = new ArrayList<>(); 
        list.add(entry.getValue()); 
        return list; 
       }, 
       (list1, list2) -> { 
        list1.addAll(list2); 
        return list1; 
       })); 

 Смежные вопросы

  • Нет связанных вопросов^_^