Stream流 - 两个list集合对象属性的合并、对象属性值运算

news2024/12/24 0:32:10

两个list集合对象属性的合并

合并两个 list<map>, 并将 userId 相同的所有属性合并到一个 map 中

list1中对象的属性:userId、userName

list2中对象的属性:userId、gender、age

最总集合中对象的属性:userId、userName、gender、age

public class Test3 {
    public static void main(String[] args){

        List<Map<String,Object>> list1 = new ArrayList<>();
        Map<String,Object> data=new HashMap<>();
        data.put("userId","100001");
        data.put("userName","唐僧");
        list1.add(data);
        data=new HashMap<>();
        data.put("userId","100002");
        data.put("userName","八戒");
        list1.add(data);

        List<Map<String,Object>> list2 = new ArrayList<>();
        data=new HashMap<>();
        data.put("userId","100001");
        data.put("gender","男");
        data.put("age",20);
        list2.add(data);
        data=new HashMap<>();
        data.put("userId","100002");
        data.put("gender","雄");
        data.put("age",1000);
        list2.add(data);

        System.out.println(list1);
        System.out.println(list2);

        //使用stream流把list1和list2根据属性userId合并一个list集合
        list1.stream().map(m1 -> {
            list2.stream().filter(m2 -> m1.get("userId").equals(m2.get("userId"))).forEach( m2 -> {
                m1.put("gender", m2.get("gender"));
                m1.put("age", m2.get("age"));
            });
            return m1;
        }).collect(Collectors.toList());

        System.out.println(list1);
        System.out.println(list2);
    }
}

运行结果:
在这里插入图片描述

结果可见,userId 相同的所有属性合并到集合 list1中。

两个list集合对象属性值运算

合并两个 list<map>, 并将 userId 相同的某个属性值进行运算

list1中对象的属性:id、name、amount

list2中对象的属性:id、name、amount

最总集合中对象的属性:id、name、amount(金额进行累加)

User :

@Data
@AllArgsConstructor
public class User {
    public String id;
    public String name;
    public BigDecimal amount;
}
public class Test3 {
    public static void main(String[] args){

        List<User> userList1 = new ArrayList<>();
        User user1 = new User("1001", "lili", new BigDecimal("100.5"));
        User user2 = new User("1002", "lucy", new BigDecimal("100.66"));
        userList1.add(user1);
        userList1.add(user2);

        List<User> userList2 = new ArrayList<>();
        User user3 = new User("1001", "lili", new BigDecimal("200.5"));
        User user4 = new User("1002", "lucy", new BigDecimal("200.66"));
        User user5 = new User("1003", "jack", new BigDecimal("200.88"));
        userList2.add(user3);
        userList2.add(user4);
        userList2.add(user5);

        System.out.println("userList1:" + userList1);
        System.out.println("userList2:" + userList2);

        List<User> collect = userList1.stream().map(u1 -> {
            userList2.stream().filter(u2 -> u2.getId().equals(u1.getId())).forEach(u2 -> {
                if (u2.getAmount() != null) {
                    u1.setAmount(u1.getAmount().add(u2.getAmount()));
                }
            });
            return u1;
        }).collect(Collectors.toList());

        System.out.println("userList1:" + userList1);
        System.out.println("collect:" + collect);
        System.out.println("userList2:" + userList2);
    }
}

运行结果:
在这里插入图片描述

结果可见,相同 id 记录的 amount 属性值进行了累计运算。

结果可见,userList1 的值发生了改变,如果不想改变原集合内容

public class Test3 {
    public static void main(String[] args){

        List<User> userList1 = new ArrayList<>();
        User user1 = new User("1001", "lili", new BigDecimal("100.5"));
        User user2 = new User("1002", "lucy", new BigDecimal("100.66"));
        userList1.add(user1);
        userList1.add(user2);

        List<User> userList2 = new ArrayList<>();
        User user3 = new User("1001", "lili", new BigDecimal("200.5"));
        User user4 = new User("1002", "lucy", new BigDecimal("200.66"));
        User user5 = new User("1003", "jack", new BigDecimal("200.88"));
        userList2.add(user3);
        userList2.add(user4);
        userList2.add(user5);

        ArrayList<User> result = new ArrayList<>();

        List<User> collect = userList1.stream().map(u1 -> {
            userList2.stream().filter(u2 -> u2.getId().equals(u1.getId())).forEach(u2 -> {
                if (u2.getAmount() != null) {
                    BigDecimal add = u1.getAmount().add(u2.getAmount());
                    result.add(new User(u1.getId(), u1.getName(), add));
                }
            });
            return u1;
        }).collect(Collectors.toList());

        System.out.println("userList1:" + userList1);
        System.out.println("userList2:" + userList2);
        System.out.println("collect:" + collect);
        System.out.println("result: " + result);
    }
}

运行结果:
在这里插入图片描述

新增集合 result 进行最终结果存储,原集合内容不变。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/544313.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C# | [二进制字符串] 与 [字节数组] 互相转换,一行代码就搞定! - CodePlus系列

C#二进制字符串与字节数组互相转换 文章目录 C#二进制字符串与字节数组互相转换前言示例代码实现思路扩展方法说明引用CodePlus库结束语 前言 开发中有时需要将二进制数据转换为字符串或相反。虽然.NET提供了一些用于二进制数据操作的类库&#xff0c;但是它们的使用有时候会比…

Elasticsearch 安装 X-pack

X-Pack是Elastic Stack扩展功能&#xff0c;提供安全性&#xff0c;警报&#xff0c;监视&#xff0c;报告&#xff0c;机器学习和许多其他功能。 ES7.0之后&#xff0c;默认情况下&#xff0c;当安装Elasticsearch时&#xff0c;会安装X-Pack&#xff0c;无需单独再安装。 1.…

编程测试被候选人吐槽了?原因可能是这些

一位前Facebook Tech Lead曾经说过&#xff1a;面试就好像是在第一次约会的时候&#xff0c;就决定是不是要跟对方结婚。 这虽然是个无奈的笑话&#xff0c;但也真实地反映了技术面试中的一个难题&#xff1a;面试官需要在相当有限的时间里&#xff0c;准确地判断候选人的技术…

什么是自然语言处理的机器翻译?

机器翻译&#xff08;Machine Translation&#xff0c;MT&#xff09;是一种自然语言处理技术&#xff0c;旨在将一种语言的文本自动翻译成另一种语言。机器翻译是自然语言处理领域的重要应用之一&#xff0c;它可以帮助人们在跨语言交流、文档翻译和信息检索等方面更加便捷和高…

Maven聚合和继承,使用IDEA构建聚合与继承工程

文章目录 1 聚合步骤1:创建一个空的maven项目步骤2:将项目的打包方式改为pom步骤3:pom.xml添加所要管理的项目步骤4:使用聚合统一管理项目 2 继承步骤1:创建一个空的Maven项目并将其打包方式设置为pom步骤2:在子项目中设置其父工程步骤3:优化子项目共有依赖导入问题步骤4:优化子…

企业数据治理内训的好处这么多,赶紧安排!

数据治理是确保数据的质量和完整性的一种方法&#xff0c;这对企业非常重要&#xff0c;因为它们需要准确的数据来做出正确的决策。 学习有效地管理和维护数据 通过内部培训&#xff0c;员工可以学习如何有效地管理和维护数据&#xff0c;从而提高数据质量和可靠性。 帮助企业…

SpringAop的实践应用

使用AOP来对前端传来的对象参数进行 BaseDto中属性的填充 这样就不用每次都去UserThreadLocal中拿了再又往BaseDto中放了 Aspect Component public class UserAspect {Pointcut("annotation(org.springframework.web.bind.annotation.RequestMapping) || annotation(o…

测试将被开发、运维替代?我后悔了!?

记得在求职的时候&#xff0c;面试官经常问我&#xff1a;“为什么要选择软件测试工作?”而我也会经常说一堆自己有的没的优势去应付。 工作这么久了&#xff0c;也不再浮躁&#xff0c;静下心来回忆当初选择软件测试工作的历程&#xff0c;也是对自己职业生涯的一次回顾。 …

每日一题162——重塑矩阵

在 MATLAB 中&#xff0c;有一个非常有用的函数 reshape &#xff0c;它可以将一个 m x n 矩阵重塑为另一个大小不同&#xff08;r x c&#xff09;的新矩阵&#xff0c;但保留其原始数据。 给你一个由二维数组 mat 表示的 m x n 矩阵&#xff0c;以及两个正整数 r 和 c &…

Conmi的正确答案——Cordova安装并编译Android应用

系统&#xff1a;debian 11 Cordova版本&#xff1a;11.1.0 Cordova的Android平台&#xff1a;10.1.2 当前安卓最新稳定API&#xff1a;33&#xff08;Android版本列表&#xff09; 1、安装npm&#xff08;cordova是基于nodejs开发的&#xff09; apt install npm -y2、使用n…

OpenCV中的图像处理3.10(八)直方图-寻找、绘制、分析(掩膜)与均衡化

目录 3.10 OpenCV中的直方图3.10.1 直方图--1&#xff1a;寻找、绘制、分析目标理论寻找直方图绘制直方图掩膜的应用其他资源 3.10.2 直方图--2&#xff1a;直方图均衡化目标理论OpenCV中的直方图均衡化CLAHE&#xff08;对比度有限的自适应直方图均衡&#xff09;其他资源 翻译…

【笔试强训选择题】Day16.习题(错题)解析

作者简介&#xff1a;大家好&#xff0c;我是未央&#xff1b; 博客首页&#xff1a;未央.303 系列专栏&#xff1a;笔试强训选择题 每日一句&#xff1a;人的一生&#xff0c;可以有所作为的时机只有一次&#xff0c;那就是现在&#xff01;&#xff01;&#xff01; 文章目录…

Linux Qt6 安装教程及错误解决

在Linux环境&#xff0c;通常为Ubuntu&#xff0c;安装Qt开发环境&#xff0c;与Windows安装相比&#xff0c;还是稍显繁琐&#xff0c;需要多做几个步骤。 这里的Ubuntu版本采用的是ubuntu-22.04.2-desktop-amd64&#xff0c;所以&#xff0c;比旧版本会少很多坑&#xff0c;…

今天面了个字节跳动拿35K出来的测试,真是砂纸擦屁股,给我露了一手啊

今年的春招已经结束&#xff0c;很多小伙伴收获不错&#xff0c;拿到了心仪的 offer。 各大论坛和社区里也看见不少小伙伴慷慨地分享了常见的面试题和八股文&#xff0c;为此咱这里也统一做一次大整理和大归类&#xff0c;这也算是划重点了。 俗话说得好&#xff0c;他山之石…

现在的00后,实在是太卷了,我们这些老油条都想辞职了......

现在的小年轻真的卷得过分了。前段时间我们公司来了个00年的&#xff0c;工作没两年&#xff0c;跳槽到我们公司起薪20K&#xff0c;都快要超过我了。 后来才知道人家是个卷王&#xff0c;从早干到晚就差搬张床到工位睡觉了。 最近和他聊了一次天&#xff0c;原来这位小老弟家…

MathType7公式编辑器新版详细介绍下载安装

由于CSDN这边不能发相关的教程等&#xff0c;若仅用于学习体验&#xff0c;请移步&#xff0c;有能力请支持正版。 wx供重浩&#xff1a;创享日记 对话框发送&#xff1a;mathtype 免费获取MathType-win-zh.exe安装包 它是一款用于数学公式编辑和排版的软件。MathType可以在Mi…

能源革命:可持续能源技术如何改变世界

随着全球气候变化日趋严重&#xff0c;能源转型成为解决气候问题和提高全球能源安全合理性的必要措施之一。可持续能源技术因其对环境的友好性和可再生性而成为了当前热点话题。你认为可持续能源技术真的能改变世界吗&#xff1f;一起来说说你的看法吧&#xff01; 一、你在工…

实现能效升级 | 基于ACM32 MCU的冰箱压缩机变频方案

概述 冰箱制冷系统中最重要的部件是压缩机。它从吸气管吸入低温低压的制冷剂气体&#xff0c;通过电机运转带动活塞对其进行压缩后&#xff0c;向排气管排出高温高压的制冷剂气体&#xff0c;为整个制冷循环提供源动力。这样就实现了压缩→冷凝→膨胀→蒸发 ( 吸热 ) 的制冷循…

1016. 子串能表示从 1 到 N 数字的二进制串

给定一个二进制字符串 s 和一个正整数 n&#xff0c;如果对于 [1, n] 范围内的每个整数&#xff0c;其二进制表示都是 s 的 子字符串 &#xff0c;就返回 true&#xff0c;否则返回 false 。 子字符串 是字符串中连续的字符序列。 示例 1&#xff1a; 输入&#xff1a;s &qu…

【C++】new和delete

new是个运算符 使用&#xff1a; new 类型&#xff08;初始值&#xff09;&#xff1b; malloc和new的区别&#xff1a; 1--new申请空间失败抛出异常&#xff0c;malloc返回空指针 ip(new(nothrow) Int(10))//不想它抛出异常 2--new调用构造函数 3--new可以重…