Список Массив объектов для сопоставления в java 8 - PullRequest
3 голосов
/ 22 января 2020

У меня есть класс Person с конструктором

Person(Fruit... favoriteFruits) {}

И 3 объекта (скажем)

Person A = new Person(Apple);
Person B = new Person(Banana, Papaya);
Person C = new Person(Pineapple, Orange);

и метод в классе Person Fruit[] getFavouriteFruits(){}

Используя потоки, я пытаюсь преобразовать это в Map

Ожидаемый результат: Карта ((Apple, A), (Банан, B), (Папайя, B), (Ананас, C), ( Оранжевый, C))

Не уверен, как слить Массив фруктов в поток

1 Ответ

3 голосов
/ 22 января 2020

Надеюсь, у меня нет опечаток. Идея состоит в том, чтобы преобразовать List<Person> в Stream всех пар (Person,Fruit) и сгруппировать их по Fruit.

Map<Fruit,List<Person>> map =
  List.of(A,B,C)
      .stream()
      .flatMap(p -> Arrays.stream(p.getFavouriteFruits())
                          .map(f -> new SimpleEntry<Person,Fruit>(p,f)))
      .collect(Collectors.groupingBy(Map.Entry::getValue,
                                     Collectors.mapping(Map.Entry::getKey,
                                                        Collectors.toList())));

SimpleEntry равно java.util.AbstractMap.SimpleEntry.

...