Как группировать по java 8 и собирать идентификаторы от родителя - PullRequest
0 голосов
/ 01 мая 2020

У меня есть класс A

Company {
  String name;
  Logo logo;
}

Logo {
  int color; //can have values=1 (green),2 (red),3 (blue) ...
  String name;
  String address;
}

Требуется вывод: для каждого типа 1,2,3 Группируйте все экземпляры Lo go по цвету. Для каждой такой группы, которые были A.id Дайте мне компании по их цветным логотипам. Например, у каких компаний есть lo go красный?

Я попытался выполнить следующие действия:

Input
List<Company> company = {//initialization}

company.stream().map(e -> e.getLogo())
          .collect(Collectors.groupingBy(e -> {Logo b = new Logo(); 
                                               b.setType(e.getType(); 
                                               return b;}, Collectors.counting()))

. Получится карта Lo go и счетчик. Как мне получить названия компаний?

Ответы [ 2 ]

1 голос
/ 01 мая 2020

Если вы искали все компании, которым дано color их logo, вы должны сгруппировать как:

Map<Integer, List<Company>> collect = company.stream()
        .collect(Collectors.groupingBy(e -> e.getLogo().getColor()));

На всякий случай, просто подсчет таких значений матовым, вы должны затем используйте Collectors.counting, например:

Map<Integer, Long> count = company.stream()
        .collect(Collectors.groupingBy(e -> e.getLogo().getColor(),
                Collectors.counting()));

Короче, не map поток, если вы хотите, чтобы значения имели тип Company.

Редактировать : Исходя из комментариев, если идея состоит в том, чтобы преобразовать Company в name, вы можете отобразить его после группировки. Использование Collectors.mapping, например:

Map<Integer, List<String>> collect = company.stream()
        .collect(Collectors.groupingBy(e -> e.getLogo().getColor(), 
                        Collectors.mapping(Company::getName, Collectors.toList())));
0 голосов
/ 01 мая 2020

Вы можете использовать groupingby коллектор и затем mapping коллектор.

companis.stream()
      .collectors(Collectors.groupingBy (c->c.getLogo().getColor(),
  Collectors.mapping (Company::getName,Collectors.toList()));
...