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