Java 11中基于自定义列表索引的多级过滤优化方案问询
多级有序集合按索引过滤的优化方案与递归实现思路
一、简化非递归实现
你当前用AtomicInteger在流里做索引匹配完全是绕远路——List本身提供了基于索引直接访问的get()方法,只要先判断索引合法性,就能一步到位拿到目标元素,代码会精简很多:
ParentEntity filterByIndexes(List<ParentEntity> parents, Integer prntIdx, Integer chldIdx) { // 原代码索引从1开始,这里转成List的0基索引 int parentListIdx = prntIdx - 1; if (parentListIdx < 0 || parentListIdx >= parents.size()) { return null; } ParentEntity targetParent = parents.get(parentListIdx); int childListIdx = chldIdx - 1; List<ChildEntity> children = targetParent.getChildEntities(); if (childListIdx < 0 || childListIdx >= children.size()) { return null; } // 若需直接返回ChildEntity,修改返回值即可 targetParent.setTargetChild(children.get(childListIdx)); return targetParent; }
核心是利用List的索引访问特性,避免流里做多余的计数判断,代码逻辑更直观。
二、递归实现(支持任意多级结构)
如果你的集合层级可能不止父-子(比如父-子-孙这类嵌套结构),可以用递归实现通用的索引过滤逻辑。先定义统一接口来规范所有层级的节点:
interface IndexedNode { List<? extends IndexedNode> getChildren(); } // 让ParentEntity和ChildEntity实现该接口 class ParentEntity implements IndexedNode { private List<ChildEntity> childEntities; @Override public List<ChildEntity> getChildren() { return childEntities; } } class ChildEntity implements IndexedNode { // 若Child还有子节点,实现getChildren即可;无则返回空列表 @Override public List<? extends IndexedNode> getChildren() { return Collections.emptyList(); } }
然后写递归方法,接收索引路径列表(比如[1,2]表示第1个父节点下的第2个子节点):
IndexedNode filterByIndexPath(List<? extends IndexedNode> rootNodes, List<Integer> indexPath) { if (indexPath.isEmpty()) { return null; } // 转换为0基索引并校验合法性 int currentIdx = indexPath.get(0) - 1; if (currentIdx < 0 || currentIdx >= rootNodes.size()) { return null; } IndexedNode currentNode = rootNodes.get(currentIdx); // 到达最后一层索引,返回当前节点 if (indexPath.size() == 1) { return currentNode; } // 递归处理下一层级 return filterByIndexPath(currentNode.getChildren(), indexPath.subList(1, indexPath.size())); }
调用示例:
List<Integer> path = Arrays.asList(2, 3); ChildEntity targetChild = (ChildEntity) filterByIndexPath(parents, path);
三、额外优化点
- 索引合法性校验必须前置,避免抛出
IndexOutOfBoundsException - 若GUI场景用0基索引,直接移除
-1的转换逻辑即可 - 递归方法可加入泛型约束,避免强制类型转换,提升代码安全性
内容的提问来源于stack exchange,提问作者Andrzej Więcławski
相关产品推荐
相关产品推荐

