我有一个问题-我有元素列表A:

class A {
String fieldA;
int fieldB
}

我想将具有相同fieldA的所有元素合并到一个元素,并以此方式汇总fieldB的所有值:
el1 = AAA 5
el2 = AAA 7
el3 = AAA 2

结果:
one element: AAA 14

如何使用Java 8 Streams做到这一点?

因此,最后,我的列表中的元素必须比开始时少。
我必须找到具有相同fieldA的所有元素,然后将它们合并到一个具有fieldB汇总的元素中。

谢谢!

最佳答案

如果您的 class 是可变的,那么您可以执行类似的操作。

List<A> out = list.stream()
    .collect(Collectors
        .collectingAndThen(
            Collectors.toMap(ele -> ele.getFieldA(), Function.identity(), (a, b) -> {
              a.setFieldB(a.getFieldB() + b.getFieldB());
              return a;
            }), m -> new ArrayList<>(m.values())));

在这里,您首先将创建一个类型的地图
Map<fieldA, A>

将A(对象)fieldB值作为对应的fieldA值的所有fieldB值之和,然后将Map的值集简单转换为列表。

希望能帮助到你。

07-26 04:28