在項目中很容易遇到那種需要取並集或者交集的情況。
如果按照傳統的方式,使用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())