ZetCode

Java Stream findFirst/findAny

最后修改于 2025 年 5 月 25 日

在本文中,我们将展示如何在 Java 流中查找第一个或任意元素。

Java Stream

Java Stream 是一个元素序列,它源自支持聚合操作的数据源。与集合不同,流不存储元素;相反,它们按需处理和计算元素。流通常用于处理来自集合、数组或 I/O 资源等源的数据,从而实现高效的处理和转换。

findFirst 方法检索流的第一个元素,并将其包装在 Optional 中返回。如果流为空,则返回一个空的 Optional。当顺序很重要时,此方法很有用,可确保选择第一个可用项。

findAny 方法从流中检索任意元素,并将其包装在 Optional 中返回。如果流为空,则返回一个空的 Optional。当处理并行流时,此方法特别有用,因为它允许检索任何可用元素而不保证顺序。

这两种方法都有助于安全地从流中提取元素,而不会在处理空数据集时导致异常,这使得它们对于 Java 中的函数式编程方法很有价值。

Java Stream findFirst 示例

在下一个示例中,我们将使用 findFirst 方法。

Main.java
void main() {

    var words = List.of("war", "cup", "cloud", "alert", "be", "ocean", "book");
    var empty = List.of();

    var first = words.stream().findFirst().orElse("not found");
    System.out.println(first);

    var first2 = empty.stream().findFirst().orElse("not found");
    System.out.println(first2);
}

我们查找单词列表的第一个元素。

var words = List.of("war", "cup", "cloud", "alert", "be", "ocean", "book");
var empty = List.of();

我们有两个字符串列表。一个有七个单词,另一个是空的。

var first = words.stream().findFirst().orElse("not found");

我们找到列表的第一个元素。如果未找到任何元素,我们返回 "not found" 字符串。

$ java Main.java
war
not found

在第二个示例中,我们过滤一个单词列表,然后找到它的第一个匹配元素。

Main.java
void main() {

    var words = List.of("war", "cup", "cloud", "alert", "be",
            "water", "warm", "ocean", "book");

    var first = words.stream().filter(e -> e.startsWith("w"))
            .findFirst().orElse("not found");
    System.out.println(first);
}

在示例中,我们找到第一个以 "w" 开头的单词。

$ java Main.java
war

Java Stream findAny 示例

在下一个示例中,我们将使用 findAny 方法。

Main.java
void main() {

    var words = List.of(
            new User("John Doe", "gardener"),
            new User("Roger Roe", "driver"),
            new User("Jozef Kral", "shopkeeper"),
            new User("Boris Brezov", "musician"),
            new User("Lucia Novak", "teacher"));

    var res = words.stream().filter(u -> u.occupation().equals("gardener"))
            .findAny();

    res.ifPresent(System.out::println);
}

record User(String name, String occupation) {
}

我们有一个用户列表。我们找出是否有任何用户是园丁。

User[name=Roger Roe, occupation=driver]

来源

Java Stream 文档

在本文中,我们介绍了 Java Stream findFirstfindAny 方法。

作者

我的名字是 Jan Bodnar,我是一位充满热情的程序员,拥有丰富的编程经验。自 2007 年以来,我一直在撰写编程文章。到目前为止,我已经撰写了超过 1,400 篇文章和 8 本电子书。我拥有超过十年的编程教学经验。

列出所有Java教程