在 Java 中查詢 Stream 的第一個元素


Java 的 Stream API 是處理資料集合的一個強大工具。一個典型的用例是在流中搜索第一個匹配特定條件的元素。我們將提供幾種處理此類任務的方法,以及程式碼示例和解釋。

語法

要獲取 Java 流的第一個元素,可以使用以下語法:

Optional<T> firstElement = stream.filter(condition).findFirst();

在此示例中,值得注意的符號包括“stream”,它指的是元素的序列;“condition”,表示用於過濾元素的謂詞;以及“firstElement?”,這是一個 Optional 容器物件,它可以儲存第一個匹配的元素,或者如果未找到匹配元素則為空。

語法的解釋

filter 建立了一個複雜的規範,用於描述流中的每個元素。只有滿足此規範的元素才會被後續操作考慮。諸如 findFirst 之類的終端操作會返回一個 Optional 物件,該物件包含找到的第一個元素,或者如果未找到匹配元素則為空。

方法 1

演算法

  • 從元素集合建立流。

  • 對流應用過濾器以匹配所需條件。

  • 使用 findFirst 方法獲取包含第一個匹配元素的 Optional 物件。

  • 檢查 Optional 物件是否為空或包含值。

  • 如果 Optional 物件不為空,則使用 get 方法檢索第一個元素。

示例

import java.util.List;
import java.util.Optional;
import java.util.function.Predicate;

public class FirstElementFinder {
   public static <T> T findFirstElement(List<T> elements, Predicate<T> condition) {
      Optional<T> firstElement = elements.stream().filter(condition).findFirst();
      return firstElement.orElse(null);
   }

   public static void main(String[] args) {
      List<Integer> numbers = List.of(1, 2, 3, 4, 5);
      Predicate<Integer> condition = number -> number > 3;
      Integer firstElement = findFirstElement(numbers, condition);
      System.out.println("First element: " + firstElement);
   }
}

輸出

First element: 4

解釋

我們建議建立一個名為 findFirstElement 的靜態函式,它接受兩個輸入:一個元素列表和一個謂詞。

此函式包含以下步驟。首先,將列表轉換為流,然後使用過濾器應用謂詞。在此階段之後,findFirst 方法將返回第一個匹配的元素。在 Optional 物件上使用 orElse 方法,如果未找到匹配元素則返回 null。

這些建議的方法會產生可靠的結果,如我們的主函式所示,它使用我們之前討論的過程來檢查哪些整數大於 3。

方法 2

演算法

  • 從元素集合建立流。

  • 使用 limit 方法將流限制為一個元素。

  • 使用 findFirst 方法獲取包含受限流的第一個元素的 Optional 物件。

  • 檢查 Optional 物件是否為空或包含值。

  • 如果 Optional 物件不為空,則使用 get 方法檢索第一個元素。

示例

import java.util.List;
import java.util.Optional;

public class FirstElementFinder {
   public static <T> T findFirstElement(List<T> elements) {
      Optional<T> firstElement = elements.stream().limit(1).findFirst();
      return firstElement.orElse(null);
   }

   public static void main(String[] args) {
      List<String> names = List.of("Alice", "Bob", "Charlie");
      String firstElement = findFirstElement(names);
      System.out.println("First element: " + firstElement);
   }
}

輸出

First element: Alice

解釋

為了使我們的過程的解釋更清晰和有條理,我們的方法包括建立一個名為 findFirstElement 的靜態模組,該模組在呼叫時需要接收一個主要由元素組成的集合作為引數。該模組的邏輯包括以下步驟:將 List<element> 轉換為 Stream<element>;將 Stream<element> 限制為 Stream<limit=1>;從 Stream<limit=1> 獲取所需的元素 -> .findFirst();如果 Optional 為空,則進行後續處理 -> .orElse(null)。在 main() 中提供了明確的示例,演示瞭如何將此方法與另一個列表中的字串一起使用。

方法 3

演算法

  • 從元素集合建立流。

  • 使用 filter 方法匹配所需條件。

  • 使用 findFirst 方法獲取包含第一個匹配元素的 Optional 物件。

  • 檢查 Optional 物件是否為空或包含值。

  • 如果 Optional 物件不為空,則使用 get 方法檢索第一個元素。

  • 方法 3 的完整可執行程式碼:

示例

import java.util.Arrays;
import java.util.Optional;
import java.util.function.Predicate;

public class FirstElementFinder {
   public static <T> T findFirstElement(T[] elements, Predicate<T> condition) {
      Optional<T> firstElement = Arrays.stream(elements).filter(condition).findFirst();
      return firstElement.orElse(null);
   }

   public static void main(String[] args) {
      String[] fruits = {"Apple", "Banana", "Cherry"};
      Predicate<String> condition = fruit -> fruit.startsWith("B");
      String firstElement = findFirstElement(fruits, condition);
      System.out.println("First element: " + firstElement);
   }
}

輸出

First element: Banana

解釋

可以使用 findFirstElement(一個靜態操作)查詢陣列的第一個匹配元素。此函式需要相關元素和搜尋條件。此方法的初始評估包括使用 Arrays.stream 進行解析,將原始元素集合轉換為流格式,然後應用關鍵過程,例如 filter 方法來實現我們的過濾要求和 findFirst()。為了管理空 orElse,將其設定為 null。來自這些級別的 Optional 物件,以避免在實際使用中出現任何間隙或問題。

如果我們只想要以“B”開頭的水果,我們可以將水果陣列和“B”作為設定引數在呼叫時傳遞。我們實現的 findFirstElement 方法將返回滿足這些要求的第一個匹配元素,允許使用者利用先前建立但現在經過改進的資料集合。

方法 4

演算法

  • 從元素集合建立流。

  • 使用 findFirst 方法獲取包含流的第一個元素的 Optional 物件。

  • 檢查 Optional 物件是否為空或包含值。

  • 如果 Optional 物件不為空,則使用 get 方法檢索第一個元素。

示例

import java.util.Optional;
import java.util.stream.Stream;

public class FirstElementFinder {
   public static <T> T findFirstElement(Stream<T> stream) {
      Optional<T> firstElement = stream.findFirst();
      return firstElement.orElse(null);
   }

   public static void main(String[] args) {
      Stream<Integer> numbers = Stream.of(1, 2, 3, 4, 5);
      Integer firstElement = findFirstElement(numbers);
      System.out.println("First element: " + firstElement);
   }
}

輸出

First element: 1

解釋

在這種方法中,我們建立了一個名為 findFirstElement 的靜態方法,該方法將元素流作為輸入引數。作為方法執行的一部分,我們使用 findFirst 從流中獲取第一個元素。在 Optional 物件表示空值的情況下,我們透過 orElse 選擇 null。在主方法中,我們演示瞭如何使用整數流使用 findFirstElement。

結論

為了瞭解如何在 Java 程式語言中訪問流的第一個元素,我們必須研究可用的各種方法;特別是因為每個選擇都為這個普遍存在的問題提供了一個可接受的解決方案——這取決於它的目標。本文旨在透過解釋示例來提供對每種技術的見解,同時確保使用者可以自信地在自己的專案中使用獲得的理解。我們建議在選擇專門針對其應用程式型別的方法之前,評估效能最佳化、可持續性和程式碼效率等關鍵方面。

更新於:2023 年 7 月 31 日

4K+ 閱讀量

啟動您的 職業生涯

透過完成課程獲得認證

開始
廣告