Java对象集合使用Java 8的Stream API合并数据

server/2024/11/28 22:40:05/

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

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

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

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


http://www.ppmy.cn/server/145744.html

相关文章

【接口封装】——6、省略用户名的超出长度部分

解释&#xff1a; "zzzzzzzzzzzzz" --> “zzzzz...” 参数&#xff1a;对应账号 作用&#xff1a;在数据库中搜索并设置对应账号的用户名&#xff0c;省略处理用户名的过长部分 头文件&#xff1a; #include <qsqlquery.h>函数定义&#xff1a; QString get…

Maven 仓库

Maven 仓库对于管理构建 Java 项目所需的依赖和插件至关重要。 Maven 仓库主要有三种类型&#xff1a;本地仓库、中央仓库和远程仓库。 本文将探讨每种仓库的用途以及如何有效使用它们。 Maven 仓库类型 本地仓库 本地仓库是位于您本地机器上的一个目录&#xff0c;Maven 在…

Linux iptables 命令详解

简介 iptables 是一个在 Linux 中的管理防火墙规则的命令行工具&#xff0c;它作为 Linux 内核的 netfilter 框架的一部分运行&#xff0c;以控制传入和传出的网络流量。 与 firewalld 相比 iptables 是基于规则的&#xff0c;每个规则必须独立定义&#xff0c;firewalld 是基…

JS基础知识04-DOM、BOM、事件、(字符串内置方法)

目录 一、DOM 1.1.DOM的基本概念 1.2.DOM的树结构 1.3.DOM的使用 1.获取DOM 2.通过关系获取节点 3.操作DOM节点 1.4.事件处理 1.5.字符串&#xff08;内置方法&#xff09; 二、BOM 2.1.windows对象 alert&#xff08;&#xff09; confirm&#xff08;&#xff0…

虚拟现实与Web3:元宇宙中的技术融合

随着技术的飞速发展&#xff0c;虚拟现实&#xff08;VR&#xff09;与Web3逐渐成为科技领域的热门话题。元宇宙作为一个以沉浸式体验为核心的虚拟世界&#xff0c;不仅是虚拟现实的延展&#xff0c;更依赖于去中心化的Web3技术的支撑。本文将探讨虚拟现实和Web3技术如何在元宇…

C++ —— 以真我之名 如飞花般绚丽 - 智能指针

目录 1. RAII和智能指针的设计思路 2. C标准库智能指针的使用 2.1 auto_ptr 2.2 unique_ptr 2.3 简单模拟实现auto_ptr和unique_ptr的核心功能 2.4 shared_ptr 2.4.1 make_shared 2.5 weak_ptr 2.6 shared_ptr的缺陷&#xff1a;循环引用问题 3. shared_ptr 和 unique_…

无人机舵机转速运行原理!

一、核心技术 PWM&#xff08;脉冲宽度调制&#xff09;技术 PWM技术通过调节电流脉冲的宽度&#xff0c;即改变电流在每个周期内的“开”与“关”的时间比例&#xff0c;来调节电机接收到的平均电流大小&#xff0c;进而控制电机的转速和扭矩。 在舵机中&#xff0c;PWM信号…

微服务即时通讯系统的实现(服务端)----(2)

目录 1. 语音识别子服务的实现1.1 功能设计1.2 模块划分1.3 模块功能示意图1.4 接口的实现 2. 文件存储子服务的实现2.1 功能设计2.2 模块划分2.3 模块功能示意图2.4 接口的实现 3. 用户管理子服务的实现3.1 功能设计3.2 模块划分3.3 功能模块示意图3.4 数据管理3.4.1 关系数据…