首頁 >Java >java教程 >使用 java.util.stream API 進行編碼時,請牢記'空洞的真相”

使用 java.util.stream API 進行編碼時,請牢記'空洞的真相”

王林
王林原創
2024-09-03 15:52:21720瀏覽

Keep

  • 簡介
  • 什麼是虛空真理?
    • 問題陳述
    • 輸入空洞的真理
      • 空洞真理的數學定義
    • 為什麼這在程式設計上很重要?
    • 參考文獻

介紹

您在程式設計中是否遇到過需要檢查清單或流中的所有元素是否符合特定條件的場景?這是編碼中的常見模式,但是當列表為空時會發生什麼?這就是空洞真理的概念發揮作用的地方。

什麼是虛空真理?

在深入研究數學定義之前,讓我們從程式碼中的實際範例開始,以了解什麼是空​​洞真理。

問題陳述

想像一下,您的任務是檢查清單中的所有元素是否符合特定條件。如果他們這樣做,您將執行特定操作。例如,考慮以下 Java 程式碼片段:

  public static void main(String[] args) {
    // Example - 1, expected to do something
    if (allNumbersAreOdd(Arrays.asList(1, 3, 5))) {
      System.out.println("do something 1");
    }
    // Example - 2, NOT expected to do anything because NOT all numbers are odd
    if (allNumbersAreOdd(Arrays.asList(1, 2, 3, 4, 5))) {
      System.out.println("do something 2");
    }
    // Example - 3, NOT expected to do anything because list is empty so there is no odd number.
    /* This is the surprising element which is known as "Vacuous truth" and it will print "do something".
     * It is applicable to both allMatch(Predicate<? super T> predicate) 
     * and noneMatch(Predicate<? super T> predicate) */
    if (allNumbersAreOdd(Collections.emptyList())) {
      System.out.println("do something 3");
    }
  }

  private static boolean allNumbersAreOdd(@Nonnull List<Integer> numbers) {
    return numbers.stream().allMatch(integer -> integer % 2 != 0);
  }

第三個例子特別有趣。為什麼列表為空時返回“All Numbers ase odd”?

輸入空洞的真理

這種行為是空洞真理的例子。在數理邏輯中,對空集合的所有元素進行斷言的陳述被認為是正確的。這是因為集合中沒有任何元素與該語句相矛盾。

空洞真理的數學定義

根據維基百科:

「空洞真理是斷言空集的所有成員都具有某種屬性的陳述。這樣的陳述被認為是正確的,因為空集中沒有反例。」

換句話說,當我們說「集合 S 的所有元素都具有屬性 P」時,如果 S 為空,則該陳述是空的,因為 S 中沒有任何元素可能違反屬性 P

為什麼這在程式設計上很重要?

理解空洞真理在程式設計中很重要,因為它會影響程式碼的邏輯和結果,特別是在處理集合、流或任何輸入可能為空的場景時。

結論
下次當您編寫一個檢查清單或流中的所有元素是否滿足條件的函數時,請記住空真值的概念。它解釋了為什麼當輸入為空時您的程式碼可能會出現意外的行為。意識到這一點可以幫助您編寫更健壯且可預測的程式。
如果您要求空列表/流不能被評估為 true,那麼您必須考慮對清單/流進行額外檢查。

  private static boolean allNumbersAreOdd(@Nonnull List<Integer> numbers) {
    return !numbers.isEmpty() && numbers.stream().allMatch(integer -> integer % 2 != 0);
  }

參考

  • 維基百科:空洞的真相
  • Java 文件中的 API 說明:
    • boolean allMatch(Predicate super T> predicate)
    • boolean noneMatch(Predicate super T> predicate)

以上是使用 java.util.stream API 進行編碼時,請牢記'空洞的真相”的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn