Java8 两个List求差

一、需求背景

有两个List实体对象如下:

  1. List实体1
     List<Long> exitList = mapper.selectXXX();//从中间表中查出已经存在的用户id列表
    
  2. List实体2
    List<SysUser> userList = mapper.selectXXX();//从系统用户表中查询符合条件是用户list
    
  3. SysUser的属性大致如下:
    public class SysUser {
    	private Long userId;
    	private String userName;
    }
    

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

二、 实现方法

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

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

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

三、进阶

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

	public class SysUser {
		private Long userId;
		private String userName;
	}

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

	public class User{
		private Long userId;
		private String nickName;
	}

两个List如下:

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

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

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

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

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

你可能感兴趣的:(springboot系列,javaWeb项目笔记,JavaTools,数据结构,Java8,Java8语法,流式编程,stream流)