1. 程式人生 > 其它 >使用Stream的groupingBy實現多級選單查詢

使用Stream的groupingBy實現多級選單查詢

技術標籤:streamjava

使用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方法略去
    }