本文介绍如何用java stream api替代传统for循环+if-else结构,高效筛选并合并满足条件的字符串子列表,提升代码可读性、可维护性与函数式表达能力。
本文介绍如何用java stream api替代传统for循环+if-else结构,高效筛选并合并满足条件的字符串子列表,提升代码可读性、可维护性与函数式表达能力。
在处理嵌套集合(如 List<List<String>>)并依据外部变量(如 var1)动态执行不同筛选逻辑时,传统的嵌套循环加多重条件判断虽可行,但存在冗余、扩展性差、不易测试等问题。使用 Java 8+ 的 Stream API 可显著优化:代码更简洁、意图更明确,且天然支持惰性求值与链式组合。
以下为优化后的实现方案:
List<List<String>> colorsList = List.of( List.of("red", "maroon"), List.of("blue", "skyblue"), List.of("pink"));int var1 = 5;List<String> listReturn = new ArrayList<>();// ✅ 安全前提:建议先校验 colorsList 非 null(生产环境必备)if (colorsList == null) { throw new IllegalArgumentException("colorsList must not be null");}if (var1 == 5) { colorsList.stream() .filter(innerList -> innerList.contains("blue")) .forEach(listReturn::addAll);} else if (var1 == 10) { colorsList.stream() .filter(innerList -> innerList.contains("pink") || innerList.contains("red")) .forEach(listReturn::addAll);}
? 关键优化点说明:
- 消除显式循环:stream() + filter() 替代 for + if,语义直指“找出含指定颜色的子列表”;
- 避免重复遍历:每个分支仅执行一次流操作,无冗余迭代;
- 方法引用提升可读性:listReturn::addAll 比 innerList -> listReturn.addAll(innerList) 更简洁清晰;
- 条件解耦:var1 的分支逻辑仍保留,但内部筛选逻辑完全函数化,便于未来抽取为独立谓词(Predicate)。
? 进阶建议(可选增强):
立即学习“Java免费学习笔记(深入)”;
Map<Integer, Predicate<List<String>>> filters = Map.of( 5, lst -> lst.contains("blue"), 10, lst -> lst.contains("pink") || lst.contains("red"));filters.getOrDefault(var1, lst -> false) .map(predicate -> colorsList.stream().filter(predicate).flatMap(List::stream).toList()) .ifPresent(listReturn::addAll);
⚠️ 注意事项:
综上,Stream API 不仅让代码更精炼,更推动我们以“数据流转”视角设计逻辑,是现代 Java 集合操作的推荐实践。