Java 中的 findFirst 流方法
java.util.stream
API 是在 Java 8 中引入的;它用于处理对象的集合。不同的源(例如数组或集合)可以创建流。
在这里,我们将仔细研究 findFirst()
和 findAny()
流方法以及何时使用它们。
Java 8 中的 findFirst()
流方法
Stream 不会改变原始数据;它使用管道方法评估流的元素。
Stream API 方法 findFirst()
是终端操作;它终止并返回结果。当我们需要序列中的第一个元素时,我们使用 findfFirst()
方法。
此方法返回一个 Optional<T>
,它描述了流的第一个元素。这里的 T
是 String
的类型。
Optional
是一个容器对象;它可能持有也可能不持有非空值。如果流为空,则返回的 Optional
将为空。
我们在不同的上下文中使用 findFirst()
方法创建了一个 fruits
和 numbers
列表,它们分别保存 String
和 Integer
类型的数据。我们在返回列表元素流的列表上调用 .stream()
。
我们需要该列表中的第一个元素,因此我们在其上调用 findFirst()
方法。它返回一个 Optional
,我们将其存储在 first
中。
我们使用返回 boolean
的 isPresent()
方法检查 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()
的行为。
相关文章
Java 中的 volatile 关键字
发布时间:2023/11/13 浏览次数:173 分类:Java
-
本文讨论了 Java 中的 volatile 关键字及其优缺点,并举例说明了如何使用。Java 是一种非常流行的编程语言,通过了解 Java,我们可以很容易地理解它为什么会在编程社区中获得这样的地位。
Java 中的 StringUtils
发布时间:2023/11/13 浏览次数:80 分类:Java
-
本文介绍 Java 中的 StringUtils 类是什么。本文介绍什么是 StringUtils 以及如何在 Java 中使用它来处理字符串。StringUtils 是一个用于处理 String 的类,它提供了比 Java String 类更多的实用方法。
Java 中的 flatMap
发布时间:2023/11/13 浏览次数:132 分类:Java
-
本文介绍 flatMap 以及如何在 Java 中使用它。本文介绍 flatMap 以及如何在 Java 中使用它。flatMap 是 Java 流中的一个操作/函数,用于在执行某些功能性任务后获取新流。在这里,我们将讨论 flatMap
在 Java 中将 Stream 元素转换为映射
发布时间:2023/11/13 浏览次数:77 分类:Java
-
我们将使用 Java 将流元素转换为映射。我们将向你展示如何使用 Collectors.toMap() 从 Java 字符串中提取映射。我们将讨论 Java Streams 的实际用途以及如何将流元素转换为映射元素。
修复 Java NoClassDefFoundError 错误
发布时间:2023/11/13 浏览次数:199 分类:Java
-
本文介绍如何修复 Java 中的 NoClassDefFoundError。在 Java 语言中,错误是主要由于缺乏资源而发生的异常。此外,错误无法在编译时捕获并在运行时发生。
在 Java 中扩展 Comparable
发布时间:2023/10/19 浏览次数:97 分类:Java
-
本教程展示了如何在 Java 中清除 StringBuilder 本指南将了解在 Java 中扩展 Comparable 接口。它写成 Comparable
。它是一个由 Java 中的许多类实现的接口。
Java 中的 Predicate 是什么
发布时间:2023/10/19 浏览次数:109 分类:Java
-
本文介绍 Java 8 中的 Predicate 接口。本教程通过 Java 示例介绍 Predicate 接口。Predicate 是 Java 中的一个接口,用作 lambda 表达式或方法引用的目标赋值。
Java 中的 parameter 与 argument
发布时间:2023/10/19 浏览次数:84 分类:Java
-
本文介绍 Java 中 parameter 和 argument 的区别。本教程通过 Java 中的示例介绍 parameter 和 argument 之间的区别。