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

Java 按集合中的内部集合元素类型分组,java,collections,java-8,java-stream,Java,Collections,Java 8,Java Stream,我有 列出店铺; 班级商店{ 私人长id; 私有字符串名称; 私人名单供应商; } 类供应商{ 私人长id; 私有字符串供应商名称; } 我想要的是 List<Shop> shops; class Shop { private Long id; private String name; private List<Supplier> suppliers; } class Supplier { private Long id; privat

我有

列出店铺;
班级商店{
私人长id;
私有字符串名称;
私人名单供应商;
}
类供应商{
私人长id;
私有字符串供应商名称;
}
我想要的是

List<Shop> shops;

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

class Supplier {
   private Long id;
   private String supplierName;
}
地图供应商商店地图;

如何使用Java Streams?

您应该覆盖
供应商
类中的
equal()
hashCode()
进行分组

Map<Supplier, List<Shop>> supplierShopsMap;
Map result=shops.stream()
.flatMap(s->s.getSuppliers().stream()
.map(sup->new SimpleEntry(sup,s))
.collect(groupingBy(Entry::getKey,//此步骤需要供应商相等的函数
映射(Entry::getValue,toList());
如果您无法修改
供应商
类以支持
equal()
,则必须创建
供应商

编辑


正如@jorn vernee所指出的,我们可以直接使用
flatMap
,而无需先收集到列表中。这是一个巨大的提升

哦,很明显我应该覆盖供应商的equals和hashcode方法:)。非常感谢。顺便说一句,您可以立即
flatMap
,您不必先收集到列表。
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())));