使用Map值在Java 8中使用流进行分组

Kev*_*vin 1 java java-8 java-stream

我正在尝试按产品类别对Product类的对象列表进行分组。不幸的是,Product类的编写方式是这样的:

class Product {
    Map<String, String> property;
}
Run Code Online (Sandbox Code Playgroud)

产品类包含一个属性映射,这些属性之一称为“ ProductType”。例如,地图可以包含:

ProductType : Machine
Price : 1000
Name : Motor Cutter
......
Run Code Online (Sandbox Code Playgroud)

我们有一个产品清单。我在想用ProductType将它们分组为Map<String, List<Product>>使用Java 8的流和lamda表达式的正确方法是什么。

如果将Product类定义为:答案是显而易见的。

class Product {
    String ProductType;
    Double Price;
    String Name;
}
Run Code Online (Sandbox Code Playgroud)

但是有了我们最上面的定义,我不知道如何实现这一点。

有人可以帮忙吗?

Era*_*ran 5

您仍然可以使用groupingBy

List<Product> products = ... 
Map<String, List<Product>> groups = 
     products.stream()
             .filter(p->p.property.containsKey("ProductType"))
             .collect(Collectors.groupingBy(p->p.property.get("ProductType")));
Run Code Online (Sandbox Code Playgroud)

我添加了filter避免null在输出中输入键的步骤Map