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