在Java中,如果你有一個(gè)包含對(duì)象的列表(List),并且想要根據(jù)對(duì)象的某個(gè)字段(比如 reid)進(jìn)行分組,同時(shí)將相同 reid 的對(duì)象的某個(gè)字段(比如 zl)的值進(jìn)行累加,你可以使用Java 8引入的Stream API來(lái)簡(jiǎn)化這個(gè)過(guò)程。
以下是一個(gè)示例代碼,它展示了如何根據(jù) reid 字段對(duì)對(duì)象列表進(jìn)行分組,并累加 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;
}
// 重寫(xiě)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(), // 使用對(duì)象本身作為初始值(這里會(huì)覆蓋,所以實(shí)際不重要)
(obj1, obj2) -> { // 合并函數(shù)
obj1.setZl(obj1.getZl() + obj2.getZl());
return obj1;
}
));
groupedAndSummed.values().forEach(System.out::println);
}
}
在這個(gè)例子中,MyObject 類有一個(gè) reid 字段和一個(gè) zl 字段。我們創(chuàng)建了一個(gè)包含多個(gè) MyObject 實(shí)例的列表 list。然后,我們使用 stream() 方法將列表轉(zhuǎn)換為流,并使用 collect([Collectors.toMap](https://zhida.zhihu.com/search?content_id=250902375&content_type=Article&match_order=1&q=Collectors.toMap&zd_token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJ6aGlkYV9zZXJ2ZXIiLCJleHAiOjE3NDM4NjI4NzIsInEiOiJDb2xsZWN0b3JzLnRvTWFwIiwiemhpZGFfc291cmNlIjoiZW50aXR5IiwiY29udGVudF9pZCI6MjUwOTAyMzc1LCJjb250ZW50X3R5cGUiOiJBcnRpY2xlIiwibWF0Y2hfb3JkZXIiOjEsInpkX3Rva2VuIjpudWxsfQ.BSKCOygsfCEBBrNDMv44-X7jlM2B28t-CbjeaUVbvXQ&zhida_source=entity)(...)) 方法來(lái)收集元素。
Collectors.toMap 方法接受三個(gè)參數(shù):
一個(gè)鍵映射函數(shù),它提取用作鍵的屬性(這里是
MyObject::getReid)。一個(gè)值映射函數(shù),它提取或計(jì)算用作值的屬性(這里我們暫時(shí)使用
Function.identity(),但實(shí)際上這個(gè)值會(huì)被后續(xù)的合并函數(shù)覆蓋)。一個(gè)合并函數(shù),它處理鍵沖突(即具有相同鍵的多個(gè)對(duì)象)。在這個(gè)函數(shù)中,我們累加
zl字段的值,并返回已更新的對(duì)象。
最后,我們打印出分組并累加后的對(duì)象集合。注意,由于我們修改了原始對(duì)象(通過(guò) setZl 方法),所以最終的結(jié)果會(huì)反映在 groupedAndSummed 映射的值中。
如果你不希望修改原始對(duì)象,你可以在合并函數(shù)中創(chuàng)建一個(gè)新的 MyObject 實(shí)例,并設(shè)置累加后的 zl 值。