使用Stream的groupingBy實現多級選單查詢
阿新 • • 發佈:2021-01-14
使用Stream的groupBy實現多級選單查詢
1 概述
查詢多級選單的結果,例如 優惠券樹,後臺系統的側邊欄的許可權樹等。
2 實現
使用stream的groupingBy方法,可以將集合根據方法內部的引數進行分組,相同引數的放在一起,就拿到了一個Map(key為選單id,value為當前選單下子選單的集合),然後遍歷Map,在Map內部進行對子選單的重新賦值。
程式碼如下:
@RequestMapping("tree")
public ResponseWrapper tree2(){
//查詢所有的選單集合
List<Tree> allList = treeMapper.selectAll();
//所有父級選單的id
List<Integer> parentTreeList = allList.stream().filter(e -> e.getModelLevel() == 1).map(Tree::getModeId).collect(Collectors.toList());
//對所有非父級選單根據其父選單id進行分組
Map<Integer, List<Tree>> suTreeMap = allList. stream().filter(e -> e.getModelLevel() != 1).collect(Collectors.groupingBy(Tree::getParentId));
List<Tree> result = new ArrayList<>();
//遍歷分組後的map
for (Map.Entry<Integer, List<Tree>> subTreeMap : suTreeMap.entrySet()) {
//獲取指定選單id的選單物件
Tree treeById = getTreeById (subTreeMap.getKey(), allList);
//對當前選單的子選單進行賦值
treeById.setChildrenTree(subTreeMap.getValue());
result.add(treeById);
}
//去除非父選單的結果
result.removeIf(e->!parentTreeList.contains(e.getModeId()));
ResponseWrapper responseWrapper = ResponseWrapper.newSuccess();
responseWrapper.addData(result);
return responseWrapper;
}
/**
* 根據選單id獲取選單物件
* @param treeId 選單id
* @param all 所有選單物件
*/
public Tree getTreeById(Integer treeId, List<Tree> all){
return all.stream().filter(e -> e.getModeId().equals(treeId)).collect(Collectors.toList()).get(0);
}
Tree實體:
public class Tree {
private Integer id;
private Integer parentId;//父級選單id
private Integer modeId;//選單id
private String modelName;
private String modelUrl;
private String appName;
private Byte modelLevel;//選單等級 1:一級選單 2:二級選單....
private List<Tree> childrenTree;//子選單集合
//get/set方法略去
}