Java Stream peek()方法示例

x33g5p2x  于2022-09-24 转载在 Java  
字(2.7k)|赞(0)|评价(0)|浏览(460)

本文将介绍 Stream.peek 方法示例。 peek 方法返回包含该流元素的流,并对每个元素执行提供的 Consumer 操作。 peek 是一个中间操作。
从 Java 文档中查找 peek 方法语法。

Stream<T> peek(Consumer<? super T> action)

参数:Consumer 作为操作传递。
返回: 该方法返回一个新流。

peek 方法主要用于调试以查看流过管道中某个点的元素。
在并行流操作中,可以在上游操作使元素可用的任何时间和任何线程中调用 peek 方法的操作。
peek 方法是中间方法,将在调用终端方法时执行。但是在 Java 9 中,对于像 count() 这样的短路操作,不会为这些元素调用 peek 方法中的操作。

Stream.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() 示例

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 方法。因此 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()

在 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。

相关文章

微信公众号

最新文章

更多