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())

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM