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

这篇具有很好参考价值的文章主要介绍了Stream流 - 两个list集合对象属性的合并、对象属性值运算。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

两个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);
    }
}

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

结果可见,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);
    }
}

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

结果可见,相同 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);
    }
}

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

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

多个集合合并属性

📅 有时候查询多个结果集需要进行合并,比如:

List1:[ {id:1001, value1:100}, {id:1002, value1:200} ]
List2:[ {id:1001, value2:200} ]
List3:[ {id:1001, value3:300}, {id:1002, value3:300}, {id:1003, value3:300} ]

📌 合并后:
List:[ {id:1001, value1:100, value2:200, value3:300}, {id:1002, value1:200, value3:300}, {id:1003, value3:300} ]

Total:

@Data
@AllArgsConstructor
public class Total {
    public String id;

    public String value1;
    public String value2;
    public String value3;
}
public class MergeValue {
    public static void main(String[] args) {
        ArrayList<Total> list1 = new ArrayList<>();
        list1.add(new Total("1001","100","",""));
        list1.add(new Total("1002","200","",""));

        ArrayList<Total> list2 = new ArrayList<>();
        list2.add(new Total("1001","","200",""));

        ArrayList<Total> list3 = new ArrayList<>();
        list3.add(new Total("1001","","","300"));
        list3.add(new Total("1002","","","300"));
        list3.add(new Total("1003","","","300"));

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

        List<Total> collect = list1.stream().map(v1 -> {
            list2.stream().filter(v2 -> v1.getId().equals(v2.getId())).forEach(v2 -> {
                v1.setValue2(v2.getValue2());
            });

            list3.stream().filter(v2 -> v1.getId().equals(v2.getId())).forEach(v2 -> {
                v1.setValue3(v2.getValue3());
            });
            return v1;
        }).collect(Collectors.toList());
        System.out.println(collect);
    }
}

运行结果:

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

结果可见,“1003” 的记录没有统计,因为以 list1 为基准进行判断赋值,list1 没有 id=“1003” 的记。

🍂 解决方案:先获取所有id,再遍历。

public class MergeValue {
    public static void main(String[] args) {
        ArrayList<Total> list1 = new ArrayList<>();
        list1.add(new Total("1001","100","",""));
        list1.add(new Total("1002","200","",""));

        ArrayList<Total> list2 = new ArrayList<>();
        list2.add(new Total("1001","","200",""));

        ArrayList<Total> list3 = new ArrayList<>();
        list3.add(new Total("1001","","","300"));
        list3.add(new Total("1002","","","300"));
        list3.add(new Total("1003","","","300"));

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

        // 1、获取所有集合中的 id
        HashSet<String> strings = new HashSet<>();
        list1.stream().forEach(v1 -> strings.add(v1.getId()));
        list2.stream().forEach(v1 -> strings.add(v1.getId()));
        list3.stream().forEach(v1 -> strings.add(v1.getId()));

        // 2、将获取的 id 放到新的集合中,用于基准遍历
        ArrayList<Total> result = new ArrayList<>();
        strings.stream().forEach(v1 -> result.add(new Total(v1, "", "", "")));
        System.out.println(result);

        // 3、遍历比较赋值
        List<Total> collect = result.stream().map(v1 -> {
            list1.stream().filter(v2 -> v1.getId().equals(v2.getId())).forEach(v2 -> {
                v1.setValue1(v2.getValue1());
            });

            list2.stream().filter(v2 -> v1.getId().equals(v2.getId())).forEach(v2 -> {
                v1.setValue2(v2.getValue2());
            });

            list3.stream().filter(v2 -> v1.getId().equals(v2.getId())).forEach(v2 -> {
                v1.setValue3(v2.getValue3());
            });
            return v1;
        }).collect(Collectors.toList());
        System.out.println(collect);
    }
}

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

✨ 完美!!✨文章来源地址https://www.toymoban.com/news/detail-455392.html

到了这里,关于Stream流 - 两个list集合对象属性的合并、对象属性值运算的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 使用Stream流筛选出List集合中符合条件的实体对象

    使用stream流筛选出List集合中符合条件的实体对象 注意:使用findFirst()方法返回的是符合条件的第一个元素,使用findAny()方法在多线程并发访问下是符合条件的任意元素 示例: 结果:

    2024年02月16日
    浏览(36)
  • JAVA 使用stream流将List中的对象某一属性创建新的List

    Java Stream是Java 8引入的一种新机制,它可以让我们以声明式方式操作集合数据,提供了更加简洁、优雅的集合处理方式。Stream是一个来自数据源的元素队列,并支持聚合操作。它的特点有: Stream 不会修改原始数据源。 Stream 操作是延迟执行的。 Stream 操作可以是无限的(比如

    2024年02月03日
    浏览(45)
  • 【Java基础】Java8 使用 stream().filter()过滤List对象(查找符合条件的对象集合)

    【Java基础】Java8 使用 stream().filter()过滤List对象(查找符合条件的对象集合)

    本篇主要说明在Java8及以上版本中,使用stream().filter()来过滤List对象,查找符合条件的集合。 集合对象以学生类(Student)为例,有学生的基本信息,包括:姓名,性别,年龄,身高,生日几项。 我的学生类代码如下: 下面来添加一些测试用的数据,代码如下: 添加过滤条件

    2024年02月12日
    浏览(39)
  • Java当中List集合根据对象某个属性进行去重

    Java当中List集合根据对象某个属性进行去重

    关于以下方法,直接可以在自己项目创建一个类,然后进行测试使用,去重方式有很多种,文本末尾也提供了每个方法的运行结果,供大家参考使用! 文章大量使用到了Java8当中的Lambda表达式,以及stream流相关基础知识。如果您用的不熟,没关系,可以直接复制下面的方案然

    2024年02月16日
    浏览(41)
  • Java中用Stream流对List对象集合转Map时key值重复的操作

    看完你还不懂,你直接喷·· 定义: 1.List是一个装Dto对象的集合 2.Dto里面有ID属性,name属性等等 3.Dto里面的ID会重复  现在要把List转成以ID为key值的map,明显key不能重复啊,所以应该怎么操作呢? (需要你有java8Stream流的基本概念,map的基本概念)   操作1:重复key,选择保留

    2024年01月18日
    浏览(41)
  • java 对象list使用stream根据某一个属性转换成map的几种方式

    可以使用Java 8中的Stream API将List转换为Map,并根据某个属性作为键或值。以下是一些示例代码: 在这个示例中,将Person对象列表转换为Map,其中键为Person对象的name属性,值为Person对象本身。 在这个示例中,将Person对象列表转换为Map,其中键为Person对象本身,值为Person对象的

    2024年02月13日
    浏览(41)
  • Java中List集合对象去重及按属性去重的8种方法

    是大家最容易想到的,先把List数据放入Set,因为Set数据结构本身具有去重的功能,所以再将SET转为List之后就是去重之后的结果。这种方法在去重之后会改变原有的List元素顺序,因为HashSet本身是无序的,而TreeSet排序也不是List种元素的原有顺序。 去重后的集合: [kobe, james,

    2024年04月15日
    浏览(342)
  • java8利用Stream方法求两个List对象的交集、差集与并集(即:anyMatch和allMatch和noneMatch的区别详解)

    1、anyMatch  判断数据列表中是否存在任意一个元素符合设置的predicate条件,如果是就返回true,否则返回false。 接口定义: boolean anyMatch(Predicate? super T predicate); 方法描述: 在anyMatch 接口定义中是接收 Predicate 类型参数,在Lamdba表达式中 PredicateT 是接收一个T类型参数,然后经过

    2024年02月06日
    浏览(39)
  • Java中list集合stream流去重

    准备类: (1)根据单字段name去重 (2)根据多字段name price去重 (3)示例 输出打印结果

    2024年02月09日
    浏览(35)
  • 并查集模板-两个操作:合并集合和查询两个元素是否属于同一个集合

    并查集模板-两个操作:合并集合和查询两个元素是否属于同一个集合

    836. 合并集合 一共有 nn 个数,编号是  1∼n 1∼n,最开始每个数各自在一个集合中。 现在要进行 mm 个操作, 操作共有两种 : M a b ,将编号为 aa 和 bb 的 两个数所在的集合合并 ,如果两个数已经在同一个集合中,则忽略这个操作; Q a b , 询问编号为 aa 和 bb 的两个

    2024年02月13日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包