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()
的行为。
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