Java8 两个List求差
一、需求背景
有两个List实体对象如下:
List实体1
List<Long> exitList = mapper.selectXXX();//从中间表中查出已经存在的用户id列表
List实体2
List<SysUser> userList = mapper.selectXXX();//从系统用户表中查询符合条件是用户list
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
public class SysUser {
private Long userId;
private String userName;
}
另一个List
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());
上述代码大致含义有两个:
- 遍历 sysUserList中的数据,将每一项映射为
item
- 遍历
userList
中的数据,将其映射为一个map - 取值: 取 userList映射结果中, nickName!= userName(
即:item.getUserName()
)的数据,并将其存放在diffUserList变量里面
还没有评论,来说两句吧...