Java 中的 findFirst 流方法

Rupam Yadav 2023年10月12日
  1. Java 8 中的 findFirst() 流方法
  2. Java 8 中的 findAny() 流方法
Java 中的 findFirst 流方法

java.util.stream API 是在 Java 8 中引入的;它用于处理对象的集合。不同的源(例如数组或集合)可以创建流。

在这里,我们将仔细研究 findFirst()findAny() 流方法以及何时使用它们。

Java 8 中的 findFirst() 流方法

Stream 不会改变原始数据;它使用管道方法评估流的元素。

Stream API 方法 findFirst() 是终端操作;它终止并返回结果。当我们需要序列中的第一个元素时,我们使用 findfFirst() 方法。

此方法返回一个 Optional<T>,它描述了流的第一个元素。这里的 TString 的类型。

Optional 是一个容器对象;它可能持有也可能不持有非空值。如果流为空,则返回的 Optional 将为空。

我们在不同的上下文中使用 findFirst() 方法创建了一个 fruitsnumbers 列表,它们分别保存 StringInteger 类型的数据。我们在返回列表元素流的列表上调用 .stream()

我们需要该列表中的第一个元素,因此我们在其上调用 findFirst() 方法。它返回一个 Optional,我们将其存储在 first 中。

我们使用返回 booleanisPresent() 方法检查 Optional 实例是否包含值。如果它返回 true,我们有一个值,我们使用 first.get() 获取它并打印出来。如果 Optional 实例为空,我们不打印任何值。

第二条语句 numbers.stream().filter((x)->x>5).findFirst() 给出了第二个 Optional 实例 firstN。我们首先应用 filter() 方法来返回基于给定谓词的过滤流。

此方法返回一个新的元素流,其值大于 5。从该流中,我们需要获取第一个元素。在我们的例子中,numbers 流中第一个值大于 5 的元素只有 8

import java.util.List;
import java.util.Optional;

public class StreamTest {
  public static void main(String[] args) {
    List<String> fruits = List.of("Apple", "Grapes", "Orange", "Kiwi");
    List<Integer> numbers = List.of(4, 5, 3, 8);

    Optional<String> first = fruits.stream().findFirst();
    if (first.isPresent()) {
      String string = first.get();
      System.out.println("First String is : " + string);
    } else {
      System.out.println("No value");
    }
    Optional<Integer> firstN = numbers.stream().filter((x) -> x > 5).findFirst();
    if (firstN.isPresent()) {
      System.out.println("First Number is : " + firstN.get());
    } else {
      System.out.println("No value");
    }
  }
}

输出:

First String is : Apple
First Number is : 8

Java 8 中的 findAny() 流方法

findAny() 方法返回描述流的任何元素的 Optional 实例。我们在下面的程序中有一个 Integer 类型元素的列表。

我们从列表中创建一个流并过滤该流以返回值小于 5 的数字。然后我们调用 findAny() 从过滤后的流中获取任何数字。

在大多数情况下,它将返回第一个元素。如果 Optional 实例 firstN 不为空,我们打印我们使用 get() 方法获得的实例值。

import java.util.List;
import java.util.Optional;

public class StreamTest {
  public static void main(String[] args) {
    List<Integer> numbers = List.of(4, 5, 2, 8);
    Optional<Integer> firstN = numbers.stream().filter((x) -> x < 5).findAny();
    if (firstN.isPresent()) {
      System.out.println("Any First Number less then 5 is : " + firstN.get());
    } else {
      System.out.println("No value");
    }
  }
}

输出:

Any First Number less then 5 is : 4

请注意,对于顺序流和并行流,findAny()findFirst() 方法的行为不会改变。不保证在非并行流的情况下 findAny() 的行为。

作者: Rupam Yadav
Rupam Yadav avatar Rupam Yadav avatar

Rupam Saini is an android developer, who also works sometimes as a web developer., He likes to read books and write about various things.

LinkedIn

相关文章 - Java Stream