三步解锁网络控制权:中兴光猫配置解密工具终极指南
2026/4/30 18:42:24
peek()的作用与用途peek()观察流中数据的“旅程”peek()的使用边界:仅限调试,禁止用于业务逻辑在传统的for循环中,我们可以很容易地使用System.out.println()或断点查看变量状态。但一旦使用了Stream:
lazy)Stream的底层实现,而不是我们的lambda表达式📌 所以我们需要一个“观察窗口” ——peek()。
peek()是什么?peek()是 Stream API 中的一个中间操作,可以让我们“偷看”流中元素在每个阶段的状态。
📘 方法签名:
Stream<T>peek(Consumer<?superT>action)Consumer(比如System.out::println)☢️
peek()仅适用于调试!不要用它去修改元素或执行副作用操作。
List<String>strings=List.of("one","two","three","four");List<String>result=strings.stream().peek(s->System.out.println("Starting with = "+s))// 阶段 1:输入流.filter(s->s.startsWith("t"))// 阶段 2:过滤首字母是 "t".peek(s->System.out.println("Filtered = "+s))// 阶段 3:通过过滤后的.map(String::toUpperCase)// 阶段 4:转大写.peek(s->System.out.println("Mapped = "+s))// 阶段 5:映射结果.toList();System.out.println("result = "+result);Startingwith=oneStartingwith=twoFiltered=twoMapped=TWOStartingwith=threeFiltered=threeMapped=THREEStartingwith=four result=[TWO,THREE]让我们一条一条分析上面是如何打印出来的:
| 元素 | 输出过程 |
|---|---|
one | 打印Starting with = one→ 被filter()排除,没再处理 |
two | 打印Starting with = two→ 通过过滤 → 打印Filtered = two→ 转大写 → 打印Mapped = TWO |
three | 类似 two 流程 |
four | 打印Starting with = four→ 被过滤掉,流程终止 |
通过peek(),你可以非常直观地看到流是如何“懒加载、单元素逐个处理”的:
filter → map → collect)这就是流式处理的本质。
stream.peek(s->database.save(s))// ❌ 千万不要用 peek 执行业务操作原因:
forEach()或其他显式终端操作替代更合适| 场景 | 是否使用 peek() |
|---|---|
| 想调试每一步中间处理结果 | ✅ |
| 想打印过滤、映射的过程 | ✅ |
| 想执行日志记录或测试调试打印 | ✅(调试环境) |
| 想保存到数据库或写文件等副作用操作 | ❌ |
| 用 peek 代替 map、filter 逻辑 | ❌ |
List<Integer>numbers=List.of(1,2,3,4,5,6);List<Integer>evens=numbers.stream().peek(n->System.out.println("Original = "+n)).filter(n->n%2==0).peek(n->System.out.println("Even = "+n)).map(n->n*n).peek(n->System.out.println("Squared = "+n)).toList();System.out.println("evens squared = "+evens);peek()是 Stream 的调试“望远镜”,用来查看元素在流中的变化路径