当前位置: 首页 > article >正文

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 方法接受三个参数:

  1. 一个键映射函数,它提取用作键的属性(这里是 MyObject::getReid)。
  2. 一个值映射函数,它提取或计算用作值的属性(这里我们暂时使用 Function.identity(),但实际上这个值会被后续的合并函数覆盖)。
  3. 一个合并函数,它处理键冲突(即具有相同键的多个对象)。在这个函数中,我们累加 zl 字段的值,并返回已更新的对象。

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

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


http://www.kler.cn/a/413236.html

相关文章:

  • C#开发合集
  • ViSTa:一个包含4000多个视频和逐步描述的层次化数据集,用于评估VLMs在不同复杂性任务中的表现。
  • 103.【C语言】数据结构之二叉树的三种递归遍历方式
  • PostgreSQL表膨胀问题解析
  • linux模拟HID USB设备及wireshark USB抓包配置
  • 前后端中Json数据的简单处理
  • 华为云国内版与国际版的差异
  • ML 系列:第 31 节— 机器学习中的协方差和相关性
  • 01-go入门
  • 游戏引擎学习第21天
  • 设计模式:12、中介者模式
  • 跨域问题?同源策略大全
  • 代码随想录算法训练营第十一天(LeetCode150.逆波兰表达式求值;LeetCode239.滑动窗口最大值;LeetCode347.前K个高频元素)
  • 欢迪迈手机商城:基于SpringBoot的多平台支持
  • Qt之详解QLockFile 文件锁
  • React的ts文件中通过createElement拼接一段内容出来
  • 以太事件解析 #7 事件侦听_02
  • 第四十篇 DDP模型并行
  • Android基本概念及控件
  • 23种设计模式-享元(Flyweight)设计模式
  • 基于SSM的婴幼儿用品商城系统+LW示例参考
  • C#里怎么样快速使用LINQ实现查询?
  • k8s集群增加nfs-subdir-external-provisioner存储类
  • UWB数字钥匙安全测距和场景应用
  • SQL EXISTS 子句的深入解析
  • 电脑上的ip地址可以改吗?如何改变ip地址