如何按Java8分组并从父级收集ID

如何按Java8分组并从父级收集ID,java,java-8,java-stream,grouping,Java,Java 8,Java Stream,Grouping,我有一个甲级 Company { String name; Logo logo; } Logo { int color; //can have values=1 (green),2 (red),3 (blue) ... String name; String address; } 所需输出:对于每种类型1、2、3,按颜色分组所有徽标实例。对于每个这样的组,A.id是什么 给我公司的颜色标志。 例如,哪些公司有红色徽标 我试着跟着 Input List<Company

我有一个甲级

Company {
  String name;
  Logo logo;
}

Logo {
  int color; //can have values=1 (green),2 (red),3 (blue) ...
  String name;
  String address;
}
所需输出:对于每种类型1、2、3,按颜色分组所有徽标实例。对于每个这样的组,A.id是什么 给我公司的颜色标志。 例如,哪些公司有红色徽标

我试着跟着

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()))
输入
列表公司={//初始化}
company.stream().map(e->e.getLogo())
.collect(Collectors.groupingBy(e->{Logo b=newlogo());
b、 setType(如getType();
返回b;},Collectors.counting())

这将生成一个徽标地图,并计算如何获得公司名称?

如果您要查找所有具有
颜色的
徽标的公司,您应分组为:

Map<Integer, List<Company>> collect = company.stream()
        .collect(Collectors.groupingBy(e -> e.getLogo().getColor()));
简而言之,如果希望值的类型为公司本身,则不要映射流

编辑:根据评论,如果想法是将
公司
转换为其
名称
,则可以在分组后进行映射。使用
收集器。映射
,例如:

Map<Integer, List<String>> collect = company.stream()
        .collect(Collectors.groupingBy(e -> e.getLogo().getColor(), 
                        Collectors.mapping(Company::getName, Collectors.toList())));
Map collect=company.stream()
.collect(收集器.groupingBy(e->e.getLogo().getColor(),
Collectors.mapping(Company::getName,Collectors.toList());

如果您要查找所有公司的
徽标
颜色
,您应将其分组为:

Map<Integer, List<Company>> collect = company.stream()
        .collect(Collectors.groupingBy(e -> e.getLogo().getColor()));
简而言之,如果希望值的类型为公司本身,则不要映射流

编辑:根据评论,如果想法是将
公司
转换为其
名称
,则可以在分组后进行映射。使用
收集器。映射
,例如:

Map<Integer, List<String>> collect = company.stream()
        .collect(Collectors.groupingBy(e -> e.getLogo().getColor(), 
                        Collectors.mapping(Company::getName, Collectors.toList())));
Map collect=company.stream()
.collect(收集器.groupingBy(e->e.getLogo().getColor(),
Collectors.mapping(Company::getName,Collectors.toList());

您可以使用
分组方式
收集器,然后使用
映射
收集器

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

您可以使用
groupingby
collector,然后使用
mapping
collector

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

对我来说,你的问题不清楚!你想要有红色标志的公司吗?那你为什么要对它们进行分组?我想要每个颜色标志的公司。红色={a,b,c}绿色={e,m,g}…对我来说,你的问题不清楚!你想要有红色标志的公司吗?那么你为什么要对它们进行分组?我想要每个颜色标志的公司。红色={a,b,c}绿色={e,m,g}…谢谢!这给了我Set如何将其转换为Set字符串,它只是公司的名称,而不是整个公司对象。我可以通过迭代整个集合来完成,收集每个值并在其上执行getName。但我觉得,应该有一种更简洁的方法。*给了我MapThank!这给了我Set如何将其转换为Set字符串,它只是t公司名称,而不是整个公司对象。我可以通过迭代整个集合来完成,收集每个值并在其上执行getName。但我觉得,应该有一种更简洁的方法。*给我一张地图