树的通用过滤,从父到子,从子到父
/** * 传入一棵树,递归到子,从子到父过节点,只要存在符合条件的子节点,则保留从父到子的路径树, * 根据预留函数式接口,利用模板方法设计模式,过滤全量资产树 * 因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); }
蓝天和白云是标配。