如何修改Java 8 Stream peek与forEach代码 实现输出abcABC而非aAbBcC
Java 8 Stream 输出顺序调整方案
核心问题本质
原代码输出aAbBcC的根本原因是Java Stream采用逐元素全链路处理的执行逻辑:每个元素会依次走完所有中间操作+终端操作流程,才会处理下一个元素。对应原代码逻辑就是a先经过peek打印小写,再经map转大写后经forEach打印大写,之后才处理b、c元素,因此得到交叉输出的结果。
要实现abcABC的输出,需要拆分打印逻辑为两个独立阶段:先统一打印全部小写字符,再统一打印全部转大写后的字符。
可选实现方案
方案1:两次独立Stream操作(最易读易维护)
直接拆分两次Stream处理,分别完成小写打印和大写打印逻辑:
List<String> strings = List.of("a", "b", "c"); // 第一阶段:批量打印所有小写字符 strings.stream().forEach(System.out::println); // 第二阶段:转大写后批量打印所有大写字符 strings.stream().map(String::toUpperCase).forEach(System.out::println);
方案2:单Stream先收集结果再打印
如果不想开启两次Stream,可以借助终端操作的触发特性,先收集转大写的结果,同时在收集阶段完成小写打印:
List<String> strings = List.of("a", "b", "c"); // 终端操作toList()触发全量处理,peek会先依次打印所有小写字符 List<String> upperStrs = strings.stream() .peek(System.out::println) .map(String::toUpperCase) .toList(); // 遍历已收集的大写列表打印所有大写字符 upperStrs.forEach(System.out::println);
方案说明
两种方案都能稳定输出abcABC:
- 方案1逻辑直观,无额外理解成本,适合绝大多数业务场景
- 方案2仅开启一次Stream处理,适合数据量较大、不想重复遍历源集合的场景
内容的提问来源于stack exchange,提问作者mihu
相关产品推荐
相关产品推荐

