Collectors.groupingBy 功能和对字段求和

M_x*_*x_r 1 java java-8 java-stream

.collect(Collectors.groupingBy(Point::getName, Collectors.summingInt(Point::getCount)));
Run Code Online (Sandbox Code Playgroud)

我有一个Point对象列表,我想按某个键(name字段)分组并按count该类的字段求和。上面的代码完成了这项工作,但返回了一个Point对象映射。但是,我想要Point返回的对象列表-而不是 map。

使用 java 8 流执行此操作的最干净方法是什么?

例子:

input = [pt("jack", 1), pt("jack", 1), pt("jack", 1)]

result = [pt("jack", 3)]
Run Code Online (Sandbox Code Playgroud)

谢谢

Hül*_*lya 7

您可以使用Collectors.toMap()合并函数作为参数。

如果您添加一个函数来求和count字段:

public class Point {
    //... 
    public static Point sum(Point p1, Point p2) {
        return new Point(p1.getName(), p1.getCount()+p2.getCount());
    }
}
Run Code Online (Sandbox Code Playgroud)

然后你可以在toMap():

List<Point> list = Collections.nCopies(10, new Point("jack", 1));

Collection<Point> output = list.stream()
        .collect(Collectors.toMap(Point::getName, Function.identity(), Point::sum)) // results as Map<String, Point> {"jack", Point("jack",10)}
        .values(); // to get the Point instances

System.out.println(output);
Run Code Online (Sandbox Code Playgroud)

输出:

[Point [name=jack, count=10]]
Run Code Online (Sandbox Code Playgroud)

  • `sum()` 函数应该创建一个新的 `Point` 实例,而不是修改传入的参数。当使用并行流时,这也很重要。如果新创建的对象的数量成为问题,则应使用基于“收集”的方法。 (4认同)