本文将介绍 Stream.peek
方法示例。 peek
方法返回包含该流元素的流,并对每个元素执行提供的 Consumer
操作。 peek
是一个中间操作。
从 Java 文档中查找 peek
方法语法。
Stream<T> peek(Consumer<? super T> action)
参数: 将 Consumer
作为操作传递。
返回: 该方法返回一个新流。
peek
方法主要用于调试以查看流过管道中某个点的元素。
在并行流操作中,可以在上游操作使元素可用的任何时间和任何线程中调用 peek
方法的操作。peek
方法是中间方法,将在调用终端方法时执行。但是在 Java 9 中,对于像 count()
这样的短路操作,不会为这些元素调用 peek
方法中的操作。
peek
方法是中间方法,所以在调用终端方法之前它不会执行。让我们通过例子来看看。找到我们没有调用任何终端方法的 peek
方法。
Stream.of(10, 20, 30).peek(e -> System.out.println(e));
不会有输出。
现在在上面的代码中使用终端方法,我们将得到 peek
方法的输出。
Stream.of(10, 20, 30).peek(e -> System.out.println(e))
.collect(Collectors.toList());
找到输出。
10 20 30
peek
方法主要用于调试。查找示例。
示例 1: 我们有一个整数流。首先我们将过滤,然后调试,然后映射它,然后再次调试。
Stream.of(10, 11, 12, 13)
.filter(n -> n % 2 == 0)
.peek(e -> System.out.println("Debug filtered value: " + e))
.map(n -> n * 10)
.peek(e -> System.out.println("Debug mapped value: " + e))
.collect(Collectors.toList());
输出
Debug filtered value: 10
Debug mapped value: 100
Debug filtered value: 12
Debug mapped value: 120
示例 2: 在此示例中,我们有一个重复值列表。我们将找到不同的值并使用 peek
方法对其进行调试。
List<String> list = Arrays.asList("AA", "BB", "CC", "BB", "CC", "AA", "AA");
String output = list.stream()
.distinct()
.peek(e -> System.out.println("Debug value: " + e))
.collect(Collectors.joining(","));
System.out.println(output);
输出
Debug value: AA
Debug value: BB
Debug value: CC
AA,BB,CC
Example-3: 在本例中,我们将使用 peek
方法将数据存储在列表中。
PeekDemo.java
package com.concretepage;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
public class PeekDemo {
public static void main(String[] args) {
List<String> debugList = new ArrayList<>();
List<String> names = Arrays.asList("Mahesh", "Suresh", "Mahendra");
names.stream()
.filter(el -> el.startsWith("M"))
.peek(e -> debugList.add(e))
.collect(Collectors.toList());
System.out.println(debugList);
}
}
输出
[Mahesh, Mahendra]
我们知道,在并行流操作中,可以在上游操作使元素可用的任何时间和任何线程中调用 peek
方法。因此 peek
方法接收的元素可能会因多次运行而有所不同。找到例子。
PeekDemoParallel.java
package com.concretepage;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;
public class PeekDemoParallel {
public static void main(String[] args) {
List<Integer> sortedList = Stream.of(15, 10, 17, 11)
.parallel()
.sorted()
.peek(e -> System.out.println("Debug: " + e))
.collect(Collectors.toList());
System.out.println("---After sorting---");
System.out.println(sortedList);
}
}
输出
Debug: 15
Debug: 11
Debug: 17
Debug: 10
---After sorting---
[10, 11, 15, 17]
在 Java 9 中,对于像 count()
这样的短路操作,不会为这些元素调用 peek
方法中的操作。 peek
方法不会向流中注入或删除元素。在流源中,元素的数量是已知的,count 是流列表的大小,因此不需要执行管道。找到代码。
long cnt = Stream.of(10, 11, 12, 13)
.peek(e -> System.out.println("Debug: " + e))
.count();
System.out.println(cnt);
peek
不会执行,输出只有 4。
版权说明 : 本文为转载文章, 版权归原作者所有 版权申明
原文链接 : https://www.concretepage.com/java/java-8/java-stream-peek
内容来源于网络,如有侵权,请联系作者删除!