树的通用过滤,从父到子,从子到父

    /**
     * 传入一棵树,递归到子,从子到父过节点,只要存在符合条件的子节点,则保留从父到子的路径树,
     * 根据预留函数式接口,利用模板方法设计模式,过滤全量资产树
     * 因java8 collection只提供removeIf,无提供retainIf,故传参判断是否保留
     *
     * @param treeNodeModels 全量资产树
     * @param templateFunction 函数接口,封装模板方法设计模式,封装资产节点查询条件
     * @param isRemove 是否是要从树节点删除
     */
    private void filerAssetTree(List<TreeNodeModel> treeNodeModels, Function<TreeNodeModel, Boolean> templateFunction, boolean isRemove) {
        treeNodeModels.removeIf(item -> {
            // 有子节点,进递归
            if (CollectionUtils.isNotEmpty(item.getChildren())) {
                filerAssetTree(item.getChildren(), templateFunction, isRemove);
            }
            // 无子节点,判断当前节点是否符合条件,不符合删除
            if (CollectionUtils.isEmpty(item.getChildren())) {
                // 判断是否删除,为true的删除
                return isRemove == templateFunction.apply(item);
            }
            // 跳出递归,还存在符合条件的子节点,不删除
            return false;
        });
    }

    /**
     * 自下而上,从子到父,过滤出符合条件的节点,保留完整树结构
     *
     * @param treeNodeModels 资产树
     * @param templateFunction 资产节点查询条件
     */
    private void bottomToUpRetain(List<TreeNodeModel> treeNodeModels, Function<TreeNodeModel, Boolean> templateFunction) {
        filerAssetTree(treeNodeModels, templateFunction, false);
    }

    /**
     * 自下而上,从子到父,删除掉符合条件的节点,留下来的节点,保留完整的树结构,从子到父
     *
     * @param treeNodeModels 资产树
     * @param templateFunction 资产节点查询条件
     */
    private void bottomToUpRemove(List<TreeNodeModel> treeNodeModels, Function<TreeNodeModel, Boolean> templateFunction) {
        filerAssetTree(treeNodeModels, templateFunction, true);
    }

    /**
     * 传入一棵树,由上到下过滤节点,过滤出符合条件的节点,只要不符合条件的节点,从树从删除该节点
     * 根据预留函数式接口,利用模板方法设计模式,过滤全量资产树
     * 因java8 collection只提供removeIf,无提供retainIf,故传参判断是否保留
     *
     * @param treeNodeModels 资产树
     * @param templateFunction 函数接口,封装模板方法设计模式,封装资产节点查询条件
     * @param isRemove 是否是要从树节点删除
     */
    private void filterTopToDown(List<TreeNodeModel> treeNodeModels, Function<TreeNodeModel, Boolean> templateFunction, boolean isRemove) {
        treeNodeModels.removeIf(item -> {
            // 判断当前节点是否符合条件,为true的删除
            if (templateFunction.apply(item)) {
                return isRemove == templateFunction.apply(item);
            }
            // 如果当前节点符合条件,并且存在子节点,则递归进入子节点继续遍历
            if (CollectionUtils.isNotEmpty(item.getChildren())) {
                filterTopToDown(item.getChildren(), templateFunction, isRemove);
            }
            // 子节点符合条件,则保留
            return false;
        });
    }

    /**
     * 自上而下,从父到子,过滤出符合条件的节点
     *
     * @param treeNodeModels 资产树
     * @param templateFunction 资产节点查询条件
     */
    private void topToDownRetain(List<TreeNodeModel> treeNodeModels, Function<TreeNodeModel, Boolean> templateFunction) {
        filterTopToDown(treeNodeModels, templateFunction, false);
    }

    /**
     * 自上而下,从父到子,删除掉符合条件的节点
     *
     * @param treeNodeModels 资产树
     * @param templateFunction 资产节点查询条件
     */
    private void topToDownRemove(List<TreeNodeModel> treeNodeModels, Function<TreeNodeModel, Boolean> templateFunction) {
        filterTopToDown(treeNodeModels, templateFunction, true);
    }

 

posted @ 2023-08-07 11:25  linzm14  阅读(62)  评论(0编辑  收藏  举报