java8-Stream filter操作:多个List取并集

在项目中很容易遇到那种需要取并集或者交集的情况。

如果按照传统的方式,使用for循环嵌套for循环来操作,也可以实现。但是代码看起来没有那么优雅。

Java8提供了Stream的操作。

例如简单的递归查找。

根据当前的分类找到相对应的所有子级对象。

如果使用传统for循环。一般的操作方式

//查出所有的对象,然后根据对象进行判断操作
List<Ojbect> list = new Array<>();
list = service.queryList()
//此处的Object泛指一个对象。
for(Object obj:list){
//TODO
//查找所有parentId=当前ID的数据,再判断是否还存在下级
//。。。。。。
}

Stream的操作方式比较简单。

如下:

//1、将所有的List数据进行筛选,然后根据筛选出来的数据进行并集操作

List<Entity> allEntities = service.querylist();

//2、筛选下级
List<Entity> sencondEntities = allEntities.parallelStream().filter(s -> s.getParentCid()==id)).collect(Collectors.toList());

//3、根据下级筛选下下级
 List<Entity> thirdleveEntities =  allEntities.stream().filter(a -> sencondEntities.stream().map(Entity::getId).collect(Collectors.toList()).contains(a.getParentId())).collect(Collectors.toList());
    

这样就可以把所有的下级和下下级都筛选出来了。

说明下,这个只是对于有限下级的操作,对于不确定的和数据集合大的,走递归可能还是比较方便一些。这个因为数据总量小于500;层级只有3级,所以选择了这样的操作。其实很多时候代码是为业务服务的,如果业务有限,没必要考虑通盘的扩展,毕竟性能和扩展性一样重要。

后记,整篇文章有用的代码只有这一句,其他都是凑数的。看懂了这行,其他的都是白搭的。

allEntities.stream().filter(a -> sencondEntities.stream().map(Entity::getId).collect(Collectors.toList()).contains(a.getParentId())).collect(Collectors.toList())

 

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值