stream流中的map和peek
时间: 2025-05-16 07:05:11 浏览: 19
### Java Stream 中 `map` 和 `peek` 方法的区别及用法
#### 1. **`map` 方法**
`map` 是一种中间操作,用于将流中的每个元素转换为另一种形式或类型的元素。它接受一个函数作为参数,并对该函数传入的每一个元素应用该函数,返回一个新的流。
- 它的主要用途是对数据进行映射或转换。
- 返回的是经过处理后的新的流对象。
代码示例:
```java
List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
List<Integer> lengths = names.stream()
.map(String::length) // 将字符串映射为其长度
.collect(Collectors.toList());
System.out.println(lengths); // 输出: [5, 3, 7]
```
此行为表明 `map` 的核心作用在于改变流中元素的形式[^1]。
---
#### 2. **`peek` 方法**
`peek` 同样是一种中间操作,但它主要用于调试目的。它可以让你在不修改流的情况下查看流中的元素。`peek` 接受一个消费型的操作(Consumer),并对流中的每个元素执行这个操作。
- 主要目的是观察流的状态而不影响最终结果。
- 不会对流的内容做任何实质性的更改。
代码示例:
```java
List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
List<String> upperCaseNames = names.stream()
.peek(name -> System.out.println("Original name: " + name)) // 打印原始名称
.map(String::toUpperCase) // 转换为大写
.peek(name -> System.out.println("Upper case name: " + name)) // 打印大写名称
.collect(Collectors.toList());
System.out.println(upperCaseNames); // 输出: [ALICE, BOB, CHARLIE]
```
上述例子展示了如何利用 `peek` 来打印日志以便于跟踪流管道内的变化过程。
---
#### 3. **主要区别**
| 特性 | `map` | `peek` |
|-------------------|-------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------|
| **功能** | 对流中的每个元素应用给定的函数并返回新流 | 对流中的每个元素执行指定的动作但不会改变它们 |
| **目标** | 数据变换 | 流程监控 |
| **适用场景** | 需要对数据结构或者值进行转化时 | 当需要记录日志或其他副作用而不需要实际改变数据本身的时候 |
---
### 总结
虽然两者都是流上的中间操作,但是他们的设计意图完全不同:一个是用来改造数据(`map`);另一个则是为了辅助开发人员更好地理解程序运行流程(`peek`)。因此,在日常编码实践中应依据具体需求合理选用这两种工具之一来构建高效的解决方案。
阅读全文
相关推荐


















