树的通用过滤,从父到子,从子到父
/** * 传入一棵树,递归到子,从子到父过节点,只要存在符合条件的子节点,则保留从父到子的路径树, * 根据预留函数式接口,利用模板方法设计模式,过滤全量资产树 * 因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); }
蓝天和白云是标配。
分类:
code
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?