在Java中,如果你有一个包含对象的列表(List),并且想要根据对象的某个字段(比如 reid
)进行分组,同时将相同 reid
的对象的某个字段(比如 zl
)的值进行累加,你可以使用Java 8引入的Stream API来简化这个过程。
以下是一个示例代码,它展示了如何根据 reid
字段对对象列表进行分组,并累加 zl
字段的值:
java">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方法以便打印输出@Overridepublic 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
值。