【问题标题】:How to group by java 8 and collect ids from parent如何按 java 8 分组并从父级收集 id
【发布时间】:2020-05-01 08:06:26
【问题描述】:

我有一个 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 按颜色对 Logo 的所有实例进行分组。对于每个这样的组,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()))

这会生成一个徽标和计数图 我如何获得公司名称?

【问题讨论】:

  • 对我来说你的问题不清楚!你想要有红色标志的公司吗?那你为什么要把它们分组呢?
  • 我希望公司有每种颜色的标志。红色 = {a, b, c} 绿色 = {e, m, g} ....

标签: java java-8 java-stream grouping


【解决方案1】:

如果您要查找在logo 中给出color 的所有公司,您应分组为:

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()));

简而言之,如果您希望值本身属于Company 类型,请不要map 流。

编辑:基于 cmets,如果想法是将Company 转换为其name,则可以在分组后进行映射。使用Collectors.mapping 如:

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

【讨论】:

  • 谢谢!这给了我 Set> 如何将其转换为 Set> String 只是公司的名称,而不是整个公司对象。
  • 我可以通过迭代整个集合并收集每个值并对其执行 getName 来做到这一点。但我觉得,应该有更简洁的方式。
  • * 给我地图>
【解决方案2】:

您可以使用groupingby 收集器,然后使用mapping 收集器。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-03
    • 2012-12-19
    • 2021-10-11
    • 1970-01-01
    • 2022-06-27
    相关资源
    最近更新 更多