Stream()之Java常用工具

在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ù):

  1. 一個(gè)鍵映射函數(shù),它提取用作鍵的屬性(這里是 MyObject::getReid)。

  2. 一個(gè)值映射函數(shù),它提取或計(jì)算用作值的屬性(這里我們暫時(shí)使用 Function.identity(),但實(shí)際上這個(gè)值會(huì)被后續(xù)的合并函數(shù)覆蓋)。

  3. 一個(gè)合并函數(shù),它處理鍵沖突(即具有相同鍵的多個(gè)對(duì)象)。在這個(gè)函數(shù)中,我們累加 zl 字段的值,并返回已更新的對(duì)象。

最后,我們打印出分組并累加后的對(duì)象集合。注意,由于我們修改了原始對(duì)象(通過(guò) setZl 方法),所以最終的結(jié)果會(huì)反映在 groupedAndSummed 映射的值中。

如果你不希望修改原始對(duì)象,你可以在合并函數(shù)中創(chuàng)建一個(gè)新的 MyObject 實(shí)例,并設(shè)置累加后的 zl 值。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容