Поток Java 8 преобразовывает Set в одно значение - PullRequest
0 голосов
/ 30 ноября 2018

У меня есть следующий поток, который возвращает Map<String, List<Set<String>>>:

Map<String, List<Set<String>>> collect = conditions.stream().collect(groupingBy(Condition::getKey, mapping(Condition::getValues, toList())));

Состояние моего объекта имеет следующие атрибуты:

String key;
List<String> values;

Как я могу преобразовать этот возврат в Map<String, List<String>> исключая дубликаты и сохраняя тот же ключ?

Спасибо!

Ответы [ 2 ]

0 голосов
/ 30 ноября 2018

Если вы работаете на Java 9+, вы можете использовать Collectors.flatMapping следующим образом:

Map<String, List<String>> collect = conditions.stream()
        .collect(groupingBy(Condition::getKey, collectingAndThen(flatMapping(
                condition -> condition.getValues().stream(), toSet()
        ), ArrayList::new)));

Поскольку вы хотите отфильтровать дубликаты, он сначала собирается в Set, а затем выдает его на ArrayList.

0 голосов
/ 30 ноября 2018

, если вы хотите продолжить с groupingBy, вы должны сделать:

Map<String, List<String>> result =  conditions.stream()
              .collect(groupingBy(Condition::getKey, mapping(Condition::getValues, toList())))
              .entrySet().stream()
              .collect(toMap(f -> f.getKey(), f -> f.getValue().stream()
                       .flatMap(List::stream).distinct().collect(toList())));

, но это может быть более компактно с toMap с функцией слияния:

Map<String, Set<String>> result = conditions.stream()
                .collect(toMap(Condition::getKey, f -> new HashSet<>(f.getValues()), 
                    (l, r) -> {l.addAll(r);return l;}));
...