Java对象集合使用Java 8的Stream API合并数据
在Java中,如果你有一个包含对象的列表(List),并且想要根据对象的某个字段(比如 reid
)进行分组,同时将相同 reid
的对象的某个字段(比如 zl
)的值进行累加,你可以使用Java 8引入的Stream API来简化这个过程。
以下是一个示例代码,它展示了如何根据 reid
字段对对象列表进行分组,并累加 zl
字段的值:
import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;
class MyObject {
private String reid;
private int zl;
// 其他字段和方法...
public MyObject(String reid, int zl) {
this.reid = reid;
this.zl = zl;
}
public String getReid() {
return reid;
}
public int getZl() {
return zl;
}
public void setZl(int zl) {
this.zl = zl;
}
// 重写toString方法以便打印输出
@Override
public String toString() {
return "MyObject{" +
"reid='" + reid + '\'' +
", zl=" + zl +
'}';
}
}
public class Main {
public static void main(String[] args) {
List<MyObject> list = Arrays.asList(
new MyObject("A", 10),
new MyObject("B", 20),
new MyObject("A", 30),
new MyObject("C", 40),
new MyObject("B", 50)
);
Map<String, MyObject> groupedAndSummed = list.stream()
.collect(Collectors.toMap(
MyObject::getReid, // 提取reid作为键
Function.identity(), // 使用对象本身作为初始值(这里会覆盖,所以实际不重要)
(obj1, obj2) -> { // 合并函数
obj1.setZl(obj1.getZl() + obj2.getZl());
return obj1;
}
));
groupedAndSummed.values().forEach(System.out::println);
}
}
在这个例子中,MyObject
类有一个 reid
字段和一个 zl
字段。我们创建了一个包含多个 MyObject
实例的列表 list
。然后,我们使用 stream()
方法将列表转换为流,并使用 collect(Collectors.toMap(...))
方法来收集元素。
Collectors.toMap
方法接受三个参数:
- 一个键映射函数,它提取用作键的属性(这里是
MyObject::getReid
)。 - 一个值映射函数,它提取或计算用作值的属性(这里我们暂时使用
Function.identity()
,但实际上这个值会被后续的合并函数覆盖)。 - 一个合并函数,它处理键冲突(即具有相同键的多个对象)。在这个函数中,我们累加
zl
字段的值,并返回已更新的对象。
最后,我们打印出分组并累加后的对象集合。注意,由于我们修改了原始对象(通过 setZl
方法),所以最终的结果会反映在 groupedAndSummed
映射的值中。
如果你不希望修改原始对象,你可以在合并函数中创建一个新的 MyObject
实例,并设置累加后的 zl
值。