Как объединить списки / наборы при сборе элементов с помощью коллекторов - PullRequest
0 голосов
/ 11 ноября 2018

Я пытаюсь получить отзывы о продуктах. Карта основана на их названии, и мне нужна карта типа

.
Map<String, Set<String>> productReviewMap;

но когда я пытаюсь получить карту, я получаю

Map<String, Set<Set<String>>> productReviewMap

на основе следующего кода:

Map<String, Set<Set<String>>> productReviewMap = products.stream().collect(
                    Collectors.groupingBy(Product::getName, Collectors.mapping(Product::getReviews, Collectors.toSet())));

Как я могу получить ожидаемую карту. Мы используем flatMap в потоках, но как мне добиться этого в коллекторах?

Ответы [ 3 ]

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

Попробуй это. это будет работать.
Предполагая, что вы используете Java 8.

Map<String,Set<String>> reviewMap = products.stream().collect(Collectors.toMap(Product::getName,Product::getReviews));
0 голосов
/ 12 ноября 2018

Нет встроенного коллектора для этого JDK8, поэтому ваши возможности ограничены:

Использование toMap:

Map<String, Set<String>> resultSet = 
        products.stream()
                .collect(toMap(Product::getName,
                        p -> new HashSet<>(p.getReviews()),
                        (l, r) -> {
                            l.addAll(r);
                            return l;
                        }));

или используйте собственный коллектор. смотрите здесь и последний фрагмент кода здесь

JDK9 имеет flatMapping и может использоваться следующим образом:

либо это:

 Map<String, Set<String>> resultSet = 
        products.stream()
                .collect(groupingBy(Product::getName,
                        mapping(Product::getReviews,
                                flatMapping(Collection::stream,
                                        toSet()))));

или это:

Map<String, Set<String>> resultSet = 
       products.stream()
               .collect(groupingBy(Product::getName,
                        flatMapping(s -> s.getReviews().stream(),toSet())));
0 голосов
/ 11 ноября 2018

Что такое "продукты" в вашем коде?

Я сделал простой пример, когда продукты - это просто arrayList, и он работает так, как вы хотите. (Я не реализовал класс "product", так что это просто p -> p

List<String> products = new ArrayList<>();
Map<String, Set<String>> productReviewMap = new HashMap<>();
final Map<String, Set<String>> collect = products.stream()
  .collect(Collectors.groupingBy(p -> p, Collectors.mapping(p -> p, Collectors.toSet())));
...