zoukankan      html  css  js  c++  java
  • 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())
    

      

  • 相关阅读:
    前端JavaScript(2) --常用内置对象,函数,伪数组 arguments,关于DOM的事件操作,DOM介绍
    前端JavaScript(3)-关于DOM操作的相关案例,JS中的面向对象、定时器、BOM、位置信息
    前端JavaScript(1) --Javascript简介,第一个JavaScript代码,数据类型,运算符,数据类型转换,流程控制,百度换肤,显示隐藏
    前端CSS(3)
    CSS标签大全
    前端CSS(2)
    前端CSS(1)
    前端HTML(二/三)
    前端基础(1)
    第一个自定义HTML网页
  • 原文地址:https://www.cnblogs.com/vincentmax/p/14380696.html
Copyright © 2011-2022 走看看