Java8 两个List求差

╰半夏微凉° 2024-04-17 06:15 115阅读 0赞

一、需求背景

有两个List实体对象如下:

  1. List实体1

    1. List<Long> exitList = mapper.selectXXX();//从中间表中查出已经存在的用户id列表
  2. List实体2

    1. List<SysUser> userList = mapper.selectXXX();//从系统用户表中查询符合条件是用户list
  3. SysUser的属性大致如下:

    1. public class SysUser {
    2. private Long userId;
    3. private String userName;
    4. }

功能需求:
userList中删除其userId包含在exitList中的数据:

二、 实现方法

有两个实现方法: 常规方法 和 Java8 流式接口实现; 常规做法就是使用两个循环,遍历两个list,然后使用迭代器删除id相等的数据,这种方法比较简单,但是代码层级比较深,不值得推荐; Java8流式接口实现如下:

  1. //删除消息表中已存在的数据: Java8 语义: 过滤掉 userId 包含在 exitList 中的数据;
  2. // 相当于 userList 集合减去 exitList ,但是,exitList集合中的数据仅仅是userList集合中的部分属性
  3. List<SysUser> list = userList.stream()
  4. .filter(item -> ! new ArrayList<>(exitList)
  5. .contains(item.getUserId())).collect(Collectors.toList());

上述代码解释:
遍历 userList 中的数据,将每一项映射为一个item(暂且这么说吧),当这一项的userId不存在于exitList中时,就选取出来,重新放在一个List列表里面;

三、进阶

上述是比较简单的情况,即:一其中个list仅仅包含一个属性(exitList 仅仅包含一个userId属性),如果两个List都包含两种以上的属性,但是功能需求却相同时,又如何实现呢?
比如:
List中的SysUser有如下属性:

  1. public class SysUser {
  2. private Long userId;
  3. private String userName;
  4. }

另一个List中的SysUser有如下属性:

  1. public class User{
  2. private Long userId;
  3. private String nickName;
  4. }

两个List如下:

  1. List<SysUser> sysUserList = mapper.selectXXX();
  2. List<User> userList = mapper.selectXXX();

我要删除sysUserList中,userName等于userList中nickName的成员数据,又该如何实现呢?
具体实现如下:

  1. List<SysUser> diffUserList = sysUserList.stream()
  2. .filter(item -> ! userList.stream().map(user -> user.getNickName()).collect(Collectors.toList())
  3. .contains(item.getUserName())).collect(Collectors.toList());

上述代码大致含义有两个:

  1. 遍历 sysUserList中的数据,将每一项映射为 item
  2. 遍历 userList中的数据,将其映射为一个map
  3. 取值: 取 userList映射结果中, nickName!= userName(即:item.getUserName())的数据,并将其存放在diffUserList变量里面

发表评论

表情:
评论列表 (有 0 条评论,115人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Java8 List

    常规做法就是使用两个循环,遍历两个list,然后使用迭代器删除id相等的数据,这种方法比较简单,但是代码层级比较深,不值得推荐;,当这一项的userId不存在于exitL...