如何使用Java Stream带条件遍历HashMap 替代for循环与if判断
Java Stream 重构实现方案
重构后的代码和原有循环逻辑完全对齐,同时Stream内部使用StringBuilder处理字符串拼接,比原循环中反复用+拼接字符串的性能更好:
import java.util.Objects; import java.util.stream.Collectors; // 若stats初始为空字符串,可直接将流处理结果赋值给stats,无需前缀拼接 stats = stats + map.entrySet().stream() // 对齐原if的三个筛选规则 .filter(entry -> entry.getValue() >= 10) .filter(entry -> !Objects.equals(entry.getKey(), " ")) .filter(entry -> entry.getKey().length() > 3) // 对齐原输出格式,键转小写后拼接值 .map(entry -> entry.getKey().toLowerCase() + " - " + entry.getValue()) // 所有符合条件的条目用换行符分隔 .collect(Collectors.joining("\n"));
注意事项
- 原循环逻辑每匹配一个条目就会追加一个换行符,最终字符串末尾会保留多余换行;上述Stream实现默认条目之间用换行分隔,末尾无额外换行,如果需要和原逻辑的末尾换行完全一致,在collect结果后手动拼接
+ "\n"即可 - 三个筛选条件可以合并写在同一个
filter中,拆分多个filter仅为了提升代码可读性,执行效率没有区别 - 如果需要处理键为
null的场景,可以在filter最前面增加entry -> entry.getKey() != null的判断,避免调用length()时抛出空指针,原代码如果存在null键也会触发空指针,属于原有逻辑的固有边界问题
内容的提问来源于stack exchange,提问作者czauto
相关产品推荐
相关产品推荐

