JDK1.8Stream根据条件过滤出两个List集合中不一样的数据


前言

  • 需求:对两个数据库(一个SqlServer,一个MySQL),同一张表做数据同步,保证两边数据库数据一致

  • 流程:把两个数据库表的数据都捞出来,通过程序过滤筛选出两个表中不一样的数据,然后处理


1.基础类

  • 由于两边表结构都一样,我这边就共用一个表方便测试
@Data
public class SysUser {

    /**
     * 名称
     */
    private String name;

    /**
     * 年龄
     */
    private Integer age;

    /**
     * 身高
     */
    private Integer height;
}

2.核心代码

  • 模拟数据
public static void main(String[] args) {
        List<SysUser> list1 = new ArrayList<>();
        SysUser user11 = new SysUser();
        user11.setName("张三");
        user11.setAge(21);
        user11.setHeight(178);
        list1.add(user11);
        SysUser user12 = new SysUser();
        user12.setName("李四");
        user12.setAge(18);
        user12.setHeight(178);
        list1.add(user12);

        List<SysUser> list2 = new ArrayList<>();
        SysUser user22 = new SysUser();
        user22.setName("张三");
        user22.setAge(19);
        user22.setHeight(178);
        list2.add(user22);
        SysUser user24 = new SysUser();
        user24.setName("王五");
        user24.setAge(22);
        user24.setHeight(168);
        list2.add(user24);
        SysUser user25 = new SysUser();
        user25.setName("李四");
        user25.setAge(18);
        user25.setHeight(178);
        list2.add(user25);
    }

2.1.单条件筛选

  • 通过年龄筛选list1不存在list2的数据
//单条件:通过 年龄 过滤
        List<SysUser> collect = list1.stream().filter(s ->
                !list2.stream().map(SysUser::getAge).collect(Collectors.toList()).contains(s.getAge())
        ).collect(Collectors.toList());

        log.info("对比结果:{}", collect);
  • 由于list1中有条age为21,list2中没有age为21的数据,所以list1中的张三这条数据就被筛选出来了

在这里插入图片描述

2.2.多条件筛选

  • 通过姓名、年龄筛选list1不存在list2的数据
//多条件:通过 姓名、年龄 过滤
        List<SysUser> collect = list1.stream().filter(tb ->
                //判断是否有业务主键相同的数据
                list2.stream().filter(t ->
                        t.getName().equals(tb.getName())
                                && t.getAge().equals(tb.getAge())
                ).findFirst().orElse(null) == null
        ).collect(Collectors.toList());
        log.info("对比结果:{}", collect);
  • 由于list1中有条name为张三、age为21,list2中没有同时满足这两个条件的数据,所以list1中的张三这条数据就被筛选出来了

在这里插入图片描述

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

tag心动

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值