使用java 8流对列表项进行分组和求和

CR7*_*CR7 3 collections lambda java-8 java-stream

假设我有一个List<Banana> bananas.Banana类的定义如下:

Banana.java

public class Banana{
   String name;
   Long weight;
   Long price;
   // getters & setters
}
Run Code Online (Sandbox Code Playgroud)

香蕉列表包含:

[
   {"banana1", 10, 20}, 
   {"banana1", 10, 20}, 
   {"banana1", 10, 20},
   {"banana2", 20, 30},
   {"banana2", 30, 30},
   {"banana3", 50, 40},
]
Run Code Online (Sandbox Code Playgroud)

我想在这里做的是分组香蕉的名称,其中总和权重列和价格列(每个单独),以便我可以得到这个结果:

[
   {"banana1", 30, 60}, 
   {"banana2", 50, 60},
   {"banana3", 50, 40},
]
Run Code Online (Sandbox Code Playgroud)

提前致谢.

Era*_*ran 6

您可以Collectors.toMap使用合并功能对它们进行分组:

Map<String,Banana> bananasByName =
    bananas.stream()
           .collect(Collectors.toMap(Banana::getName,
                                     Function.identity(),
                                     (b1,b2)->{ 
                                                 b1.addWeightAndPrice(b2); return b1; 
                                              }));
Run Code Online (Sandbox Code Playgroud)

addWeightAndPrice的实例方法在哪里Banana,将传递的权重和价格添加BananaBanana调用它的实例.

如果您不想改变原始Banana实例,可以更改合并功能以创建新Banana实例,并向其添加两个输入Banana实例的权重和价格.