ホームページ  >  記事  >  Java  >  java.util.stream API を使用してコーディングするときは、「空の真実」を念頭に置いてください。

java.util.stream API を使用してコーディングするときは、「空の真実」を念頭に置いてください。

王林
王林オリジナル
2024-09-03 15:52:21633ブラウズ

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);
  }

3 番目の例は特に興味深いです。リストが空のときに「すべての数値が奇数」を返すのはなぜですか?

空虚な真実を入力してください

この行動は空虚な真実の一例です。数学的論理では、空のセットのすべての要素について何かを主張するステートメントは真とみなされます。これは、セット内にステートメントと矛盾する要素がないためです。

空虚な真実の数学的定義

ウィキペディアによると:

「空の真実とは、空の集合のすべてのメンバーが特定の特性を持っていると主張するステートメントです。空のセットには反例がないため、そのようなステートメントは真であると見なされます。」

言い換えると、「集合 S のすべての要素はプロパティ P を持っている」と言うとき、S が空の場合、プロパティ P に違反する可能性のある要素は S に 1 つも存在しないため、このステートメントは事実上真です

なぜこれがプログラミングにおいて重要なのでしょうか?

空虚な真実を理解することは、特にコレクション、ストリーム、または入力が空になる可能性のあるシナリオを扱う場合、コードのロジックと結果に影響を与える可能性があるため、プログラミングにおいて重要です。

結論
次回、リストまたはストリーム内のすべての要素が条件を満たすかどうかをチェックする関数を作成するときは、空虚な真実の概念を思い出してください。これは、入力が空の場合にコードが予期しない動作をする理由を説明しています。これを認識すると、より堅牢で予測可能なプログラムを作成するのに役立ちます。
空のリスト/ストリームを true として評価してはいけないという要件がある場合は、リスト/ストリームの追加チェックを検討する必要があります。

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

参考文献

  • ウィキペディア: 空虚な真実
  • Java ドキュメントの API ノート:
    • boolean allMatch(Predicate predicate)
    • boolean noneMatch(Predicate super T> predicate)

以上がjava.util.stream API を使用してコーディングするときは、「空の真実」を念頭に置いてください。の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。