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

时间:2018-05-05 10:36:14

标签: java collections java-8 java-stream

我有

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 个答案:

答案 0 :(得分:3)

您应该覆盖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())));

如果您无法修改Supplier课程以支持equal(),那么您必须创建Supplier

的地图

修改

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