Java中如何高效过滤列表并避免已命中规则的元素重复校验
实现优化方案
核心优化点
- 移除不必要的Map中转操作,减少一次全量遍历和哈希表的额外空间开销
- 命中任意过滤器后立刻终止当前元素的后续校验,消除无意义的重复计算
- 修复原代码中Collection强转List的运行时异常问题
优化后代码示例
普通遍历版本
private List<Data> applyFilter(Request request) { List<Data> dataList = request.getDataList(); if (CollectionUtils.isEmpty(dataList)) { return new ArrayList<>(); } List<Data> result = new ArrayList<>(); for (Data data : dataList) { boolean isInvalid = false; for (Filter<Request> filter : filters) { // 只要命中任意过滤器规则,直接跳出循环 if (filter.getReason(data) != null) { isInvalid = true; break; } } if (!isInvalid) { result.add(data); } } return result; }
Stream 写法版本
如果偏好函数式编程风格,可以用Stream实现:
private List<Data> applyFilter(Request request) { List<Data> dataList = request.getDataList(); if (CollectionUtils.isEmpty(dataList)) { return new ArrayList<>(); } // 封装过滤逻辑:只要命中任意过滤器就返回false(被过滤掉) Predicate<Data> isValid = data -> { for (Filter<Request> filter : filters) { if (filter.getReason(data) != null) { return false; } } return true; }; return dataList.stream() .filter(isValid) .collect(Collectors.toList()); }
额外性能优化建议
如果过滤器列表是固定顺序的,可以把命中率更高的过滤器排在列表前面,可以让更多无效元素在更短的校验流程中被筛选掉,进一步降低整体计算量。
内容的提问来源于stack exchange,提问作者user3407267
相关产品推荐
相关产品推荐

