stream流中.peek()
时间: 2023-08-05 08:29:29 浏览: 84
在Java 8中,Stream API提供了一系列用于处理集合数据的方法,其中就包括了`peek`方法。`peek`方法是一个中间操作,它可以在Stream的流程中插入一些操作,而这些操作不会改变Stream的元素,而是提供对元素进行检查的能力。
`peek`方法接收一个Consumer类型的函数式接口作为参数,该接口定义了一个名为`accept()`的方法,该方法接收一个参数并进行处理。这里的参数就是Stream中的元素。因此,我们可以在`peek`方法中对每个元素进行检查或者对元素进行一些操作,例如,打印元素的值、记录元素的状态等。
需要注意的是,`peek`方法并不会改变Stream的元素,也不会产生新的Stream,而是返回与原始Stream相同的Stream。因此,`peek`方法通常用于调试或者记录Stream的执行过程,而不是用于对Stream进行操作。
相关问题
java中,stream().map 与 stream().peek 区别 ?
在Java中,stream().map()和stream().peek()是两个不同的操作。其中,stream().map()是将一个函数应用于流中的每个元素,并返回一个新的流,而stream().peek()则是返回一个由原始流中的元素组成的流,同时在从生成的流中消耗元素时对每个元素执行提供的操作。
举个例子,假设我们有一个整数列表,我们想要将每个整数乘以2并打印出来。我们可以使用stream().map()来实现这个操作:
```java
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
List<Integer> doubledNumbers = numbers.stream().map(n -> n * 2).collect(Collectors.toList());
System.out.println(doubledNumbers);
```
输出结果为:[2, 4, 6, 8, 10]
如果我们想要查看原始列表中的每个元素,可以使用stream().peek()来实现:
```java
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
numbers.stream().peek(System.out::println).forEach(n -> System.out.println("Doubled: " + (n * 2)));
```
输出结果为:
```
1
Doubled: 2
2
Doubled: 4
3
Doubled: 6
4
Doubled: 8
5
Doubled: 10
```
java list.stream().filter和list.stream().peek却别
在Java 8的Stream API中,`filter()` 和 `peek()` 都是用来操作集合的高阶函数,但它们的作用略有区别。
1. **`filter(Predicate<T>)`:** 这个方法用于过滤流中的元素。它接受一个谓词(Predicate),这个谓词是一个返回布尔值的函数,如果元素满足这个条件(谓词返回true),则会被包含在结果流中。举个例子,如果你想从列表中筛选出所有的偶数,你可以这样做:
```java
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
List<Integer> evenNumbers = numbers.stream()
.filter(n -> n % 2 == 0)
.collect(Collectors.toList());
```
结果将是 `[2, 4]`。
2. **`peek(Consumer<T>):**** 这个方法应用于每个元素上,但它并不改变元素本身或流的结构。`peek()` 接收一个消费者(Consumer),该消费者对每个元素执行一些副作用操作(例如打印、计数等),而不会影响实际的流结果。例如:
```java
List<String> words = Collections.singletonList("hello");
words.stream()
.peek(System.out::println)
.forEach(System.out::println); // 打印 "hello" 后,再打印列表中原有的每一个元素
```
输出将是:
```
hello
hello
```
总结来说,`filter()` 改变了流的内容,而 `peek()` 只是做了额外的操作但不影响最终结果。如果你关心的是过滤后的数据,用 `filter()`;如果你需要对元素做些额外操作但结果不变,用 `peek()`。
阅读全文