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