代码之家  ›  专栏  ›  技术社区  ›  antongarakh

按集合中的内部集合元素类型分组

  •  1
  • antongarakh  · 技术社区  · 8 年前

    我有

    List<Shop> shops;
    
    class Shop {
       private Long id;
       private String name;
       private List<Supplier> suppliers;
    }
    
    class Supplier {
       private Long id;
       private String supplierName;
    }
    

    我想得到的是

    Map<Supplier, List<Shop>> supplierShopsMap;
    

    如何使用Java Streams?

    1 回复  |  直到 8 年前
        1
  •  3
  •   Mạnh Quyết Nguyễn    8 年前

    您应该覆盖 equal() hashCode() 在里面 Supplier 用于分组的类。

    Map<Supplier, List<Shop>> result = shops.stream()
           .flatMap(s -> s.getSuppliers().stream()
                               .map(sup -> new SimpleEntry<>(sup, s))
           .collect(groupingBy(Entry::getKey,                 // This step requires Supplier equal function
                               mapping(Entry::getValue, toList())));
    

    如果无法修改 供应商 要支持的类 相等() 然后您必须创建 供应商

    编辑

    正如@jorn vernee指出的,我们可以使用 flatMap 直接收集而不首先收集到列表中。这是一个巨大的推动

    推荐文章