要说调试 Stream 流程最轻量的方式,非 peek 莫属。它扮演的是一个“中间观察员”的角色——每个元素流过时,你可以让它执行某个动作(比如打印一行日志),但它本身不会改动数据。简单说,就是让你在过滤、映射这些中间步骤之间“偷看一眼”当前的状态。

Ja va中 Stream peek 怎么做 Debug 打印调试

其实核心就一句话:Stream.peek() 不改变数据,只在每个元素经过时执行你指定的操作,比如打印日志。 但要记住,它是个中间操作,必须后面跟上终止操作才会真正干活,否则你写再多 peek 都是白搭。

peek 的核心作用:观察中间状态

熟悉 Stream 的都知道,它是惰性求值的——filtermap 这些中间操作不会立即执行,只有遇到 collectforEach 这类终止操作时,整条流水线才会动起来。而 peek 就是在链条上“插个眼”,让你看到某个环节的元素长什么样。

注意一个关键点:peek 必须放在终止操作之前,否则什么都不会打印。这不是 bug,是设计。

基本用法:打印当前元素

直接传一个 Lambda 表达式进去,用 System.out.println 输出就行。

List 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 和 forEach 的区别别搞混

forEach 是终止操作,一执行完流就结束了;peek 是中间操作,必须后面还有终止操作才能生效。下面这段代码什么都不会打印

list.stream().peek(System.out::println); // ❌ 没有终止操作,整条流根本没运行

而这样才行:

list.stream().peek(System.out::println).count(); // ✅ count 是终止操作

替代方案:什么时候不该用 peek

本文转载于:https://www.php.cn/faq/2823451.html 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。