文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

jdk8中怎么使用stream实现对象属性的合并

2023-06-26 06:12

关注

这篇“jdk8中怎么使用stream实现对象属性的合并”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“jdk8中怎么使用stream实现对象属性的合并”文章吧。

java使用stream实现list中对象属性的合并:根据两个List中的某个相同字段合并成一条List,包含两个List中的字段

一、前言

为什么要用Lambda表达式Stream流做集合的处理? 因为效率高、代码简洁、高端大气上档次!

(1)描述:比如一个List集合中List<对象1>,该对象1包含A、B和C列;另外一个List集合中List<对象2>,该对象2包含A、D列;

(2)问题:需要将两个List合成List<对象3>返回,该对象3包含A、B、C、D列

(3)实现:使用stream实现两个list集合合并成一个list集合

简要说明:filter的使用方式为: filter(item -> item的逻辑判断 ) ,其中filter会保留判断条件为true的记录

二、示例

示例1:java8 合并两个 list<map>

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

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

import java.util.*;import java.util.stream.Collectors;public class ListTest {    public static void main(String[] args) {        mergeList();    }        public static List<Map<String,Object>> mergeList(){        //构建List集合1        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);        data=new HashMap<>();        data.put("userId","100003");        data.put("userName","悟空");        list1.add(data);        data=new HashMap<>();        data.put("userId","100004");        data.put("userName","沙僧");        list1.add(data); //构建List集合2        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);        data=new HashMap<>();        data.put("userId","100003");        data.put("gender","雄");        data.put("age",600);        list2.add(data);        data=new HashMap<>();        data.put("userId","100004");        data.put("gender","男");        data.put("age",800);        list2.add(data);//使用stream流把list1和list2根据属性userId合并一个list集合        List<Map<String, Object>> list = list1.stream().map(m -> {            list2.stream().filter(m2-> Objects.equals(m.get("userId"),m2.get("userId"))).forEach(m2-> {                m.put("gender",m2.get("gender"));                m.put("age",m2.get("age"));            });            return m;        }).collect(Collectors.toList());        for(Map<String, Object> map:list){            System.out.println(map.toString());        }        return list;    }}

合并运行结果:

jdk8中怎么使用stream实现对象属性的合并

示例2:java8 合并两个 list<T>

java8 合并两个 list<T>, 并将tickeId相同的所有属性合并到一个T中

list1中对象的属性:ticketId、ticketName
list2中对象的属性:ticketId、saleNum、batchAvailableNum
最总集合中对象的属性:ticketId、ticketName、saleNum、batchAvailableNum

import java.util.*;import java.util.stream.Collectors;public class ListTest1 {    public static void main(String[] args) {        mergeList();    }        public static List<Ticket> mergeList(){   //构建List集合1        List<Ticket> list1 = new ArrayList<>();        Ticket data=new Ticket();        data.setTicketId("100001");        data.setTicketName("唐僧");        list1.add(data);        data=new Ticket();        data.setTicketId("100002");        data.setTicketName("八戒");        list1.add(data);        data=new Ticket();        data.setTicketId("100003");        data.setTicketName("悟空");        list1.add(data);        data=new Ticket();        data.setTicketId("100004");        data.setTicketName("沙僧");        list1.add(data);//构建List集合2        List<Ticket> list2 = new ArrayList<>();        data=new Ticket();        data.setTicketId("100001");        data.setSaleNum("20");        data.setBatchAvailableNum("10");        list2.add(data);        data=new Ticket();        data.setTicketId("100001");        data.setSaleNum("20");        data.setBatchAvailableNum("10");        list2.add(data);        data=new Ticket();        data.setTicketId("100002");        data.setSaleNum("1000");        data.setBatchAvailableNum("600");        list2.add(data);        data=new Ticket();        data.setTicketId("100003");        data.setSaleNum("600");        data.setBatchAvailableNum("100");        list2.add(data);        data=new Ticket();        data.setTicketId("100004");        data.setSaleNum("800");        data.setBatchAvailableNum("300");        list2.add(data);         //使用stream流把list1和list2根据属性ticketId合并一个list集合        List<Ticket> list = list1.stream().map(m -> {            list2.stream().filter(m2-> Objects.equals(m.getTicketId(),m2.getTicketId())).forEach(m2-> {                m.setSaleNum(m2.getSaleNum());                m.setBatchAvailableNum(m2.getBatchAvailableNum());            });            return m;        }).collect(Collectors.toList());        for(Ticket ticket:list){            System.out.println(ticket.getTicketId()+","+ticket.getTicketName()+","+ticket.getSaleNum()+","+ticket.getBatchAvailableNum());        }        return list;    }}

合并运行结果:

jdk8中怎么使用stream实现对象属性的合并

示例3:java8 合并两个 list<T>,集合个数前者小于后者,要后者

list1中对象的属性:ticketId、ticketName
list2中对象的属性:ticketId、batchId
最总集合中对象的属性:ticketId、ticketName、batchId
list1:
ticketId:10001 , ticketName:唐僧
ticketId:10002 , ticketName:八戒
list2:
ticketId:10001 , batchId:1
ticketId:10001 , batchId:2
ticketId:10002 , batchId:1
ticketId:10002 , batchId:2
ticketId:10003 , batchId:2
想要的结果:list1合并到 list 2
ticketId:10001 , ticketName:唐僧,batchId:1
ticketId:10001 , ticketName:唐僧,batchId:2
ticketId:10002 , ticketName:八戒,batchId:1
ticketId:10002 , ticketName:八戒,batchId:2
ticketId:10003 , ticketName:八戒,batchId:2

代码实现:

import java.util.ArrayList;import java.util.List;import java.util.Objects;import java.util.stream.Collectors;public class ListTest2 {    public static void main(String[] args) {        mergeList();    }        public static List<Ticket> mergeList(){        List<Ticket> list1 = new ArrayList<>();        Ticket data=new Ticket();        data.setTicketId("100001");        data.setTicketName("唐僧");        list1.add(data);        data=new Ticket();        data.setTicketId("100002");        data.setTicketName("八戒");        list1.add(data);        List<Ticket> list2 = new ArrayList<>();        data=new Ticket();        data.setTicketId("100001");        data.setBatchId("1");        list2.add(data);        data=new Ticket();        data.setTicketId("100001");        data.setBatchId("2");        list2.add(data);        data=new Ticket();        data.setTicketId("100002");        data.setBatchId("1");        list2.add(data);        data=new Ticket();        data.setTicketId("100002");        data.setBatchId("2");        list2.add(data);        data=new Ticket();        data.setTicketId("100002");        data.setBatchId("3");        list2.add(data);        //使用stream流把list1合并到list2集合中,根据ticketId属性        List<Ticket> list = list2.stream().map(m -> {            list1.stream().filter(m2-> Objects.equals(m.getTicketId(),m2.getTicketId())).forEach(m2-> {                m.setTicketId(m2.getTicketId());                m.setTicketName(m2.getTicketName());            });            return m;        }).collect(Collectors.toList());        for(Ticket ticket:list){            System.out.println(ticket.getTicketId()+","+ticket.getTicketName()+","+ticket.getBatchId());        }        return list;    }}

合并运行结果:

jdk8中怎么使用stream实现对象属性的合并

示例4:java8 合并两个 list<T>,集合个数前者大于后者,要后者

list1中对象的属性:ticketId、ticketName
list2中对象的属性:ticketId、batchId
最总集合中对象的属性:ticketId、ticketName、batchId
list1:
ticketId:10001 , ticketName:唐僧
ticketId:10002 , ticketName:八戒
list2:
ticketId:10001 , batchId:1
ticketId:10001 , batchId:2

想要的结果:list1合并到 list 2,过滤掉batch不存在的数据
ticketId:10001 , ticketName:唐僧,batchId:1
ticketId:10001 , ticketName:唐僧,batchId:2

代码实现:

import java.util.ArrayList;import java.util.List;import java.util.Objects;import java.util.stream.Collectors;public class ListTest3 {    public static void main(String[] args) {        mergeList();    }        public static List<Ticket> mergeList(){        List<Ticket> list1 = new ArrayList<>();        Ticket data=new Ticket();        data.setTicketId("100001");        data.setTicketName("唐僧");        list1.add(data);        data=new Ticket();        data.setTicketId("100002");        data.setTicketName("八戒");        list1.add(data);        List<Ticket> list2 = new ArrayList<>();        data=new Ticket();        data.setTicketId("100001");        data.setBatchId("1");        list2.add(data);        data=new Ticket();        data.setTicketId("100001");        data.setBatchId("2");        list2.add(data);//        data=new Ticket();//        data.setTicketId("100002");//        data.setBatchId("1");//        list2.add(data);////        data=new Ticket();//        data.setTicketId("100002");//        data.setBatchId("2");//        list2.add(data);////        data=new Ticket();//        data.setTicketId("100002");//        data.setBatchId("3");//        list2.add(data);        //使用stream流把list1合并到list2集合中,根据ticketId属性        List<Ticket> list = list2.stream().map(m -> {            list1.stream().filter(m2-> Objects.equals(m.getTicketId(),m2.getTicketId())).forEach(m2-> {                m.setTicketId(m2.getTicketId());                m.setTicketName(m2.getTicketName());            });            return m;        }).collect(Collectors.toList());        for(Ticket ticket:list){            System.out.println(ticket.getTicketId()+","+ticket.getTicketName()+","+ticket.getBatchId());        }        return list;    }}

合并运行结果:

jdk8中怎么使用stream实现对象属性的合并

以上就是关于“jdk8中怎么使用stream实现对象属性的合并”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注编程网行业资讯频道。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯