Stream.peek()是调试流式操作最轻量的方式,它作为中间操作在每个元素经过时执行指定动作(如打印日志)却不改变数据,必须置于终止操作前才生效,常用于观察过滤、映射等中间状态。
Stream.peek() 是调试流式操作最轻量的方式,它不改变数据,只在每个元素经过时执行你指定的操作,比如打印日志。
Stream 是惰性求值的,中间操作(如 filter、map)不会立即执行,只有遇到终止操作(如 collect、forEach)才真正触发。peek 就是在这个链条中“插个眼”,让你看到某个环节的元素长什么样。
注意:peek 必须出现在终止操作之前,否则什么都不会打印。
直接传入 Lambda 表达式,用 System.out.println 输出:
立即学习“Java免费学习笔记(深入)”;
List<String> list = Arrays.asList("apple", "banana", "cherry");list.stream() .filter(s -> s.length() > 5) .peek(s -> System.out.println("过滤后拿到:" + s)) .map(String::toUpperCase) .peek(s -> System.out.println("转大写后:" + s)) .collect(Collectors.toList());
输出会是:
过滤后拿到:banana转大写后:BANANA过滤后拿到:cherry转大写后:CHERRY
.peek(s -> { if (s.contains("err")) System.out.println("可疑项:" + s); })
forEach 是终止操作,执行完就结束了;peek 是中间操作,必须后面还有终止操作才能生效。下面这段代码 什么都不会打印:
list.stream().peek(System.out::println); // ❌ 没有终止操作,整条流根本没运行
而这样才可以:
list.stream().peek(System.out::println).count(); // ✅ count 是终止操作