Stream()之Java常用工具

在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](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)(...)) 方法来收集元素。

Collectors.toMap 方法接受三个参数:

  1. 一个键映射函数,它提取用作键的属性(这里是 MyObject::getReid)。

  2. 一个值映射函数,它提取或计算用作值的属性(这里我们暂时使用 Function.identity(),但实际上这个值会被后续的合并函数覆盖)。

  3. 一个合并函数,它处理键冲突(即具有相同键的多个对象)。在这个函数中,我们累加 zl 字段的值,并返回已更新的对象。

最后,我们打印出分组并累加后的对象集合。注意,由于我们修改了原始对象(通过 setZl 方法),所以最终的结果会反映在 groupedAndSummed 映射的值中。

如果你不希望修改原始对象,你可以在合并函数中创建一个新的 MyObject 实例,并设置累加后的 zl 值。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容