オブジェクト参照が関数参照と等しくありません: 関数を比較するには、equals() メソッドを使用してください。関数参照はラムダ式と一貫性がありません。比較には常に一貫した型 (関数参照またはラムダ) を使用してください。非同期関数の比較は信頼性が低い: 同時環境で非同期関数の結果を比較しないでください。
Java 関数の比較でよくある落とし穴と間違いを探る
Java の関数比較では、予期しない動作が発生し、バグが発生する可能性があります。そしてわかりにくいコード。このような問題を回避するには、これらの潜在的な落とし穴を理解することが重要です。
罠 1: オブジェクト参照は関数参照と等しくない
2 つの関数が同じ関数を持つ場合でも、オブジェクト参照は関数参照と等しくありません。 ==
演算子を使用してオブジェクト参照を比較すると、常に false
が返されます。
コード例:
Function<Integer, Integer> f1 = x -> x + 1; Function<Integer, Integer> f2 = x -> x + 1; // 输出: false System.out.println(f1 == f2);
解決策:
関数を比較するには、equals()
を使用します。方法。このメソッドは、関数の参照ではなく関数自体を比較します。
変更されたコード:
// 输出: true System.out.println(f1.equals(f2));
トラップ 2: 関数参照がラムダ式と矛盾しています
ラムダ式が作成されます関数参照とは構文的に異なる匿名関数。ラムダ式と関数参照を比較しようとすると、ClassCastException
が発生します。
コード例:
Function<Integer, Integer> f1 = Integer::parseInt; Function<Integer, Integer> f2 = x -> Integer.parseInt(x); // 抛出 ClassCastException System.out.println(f1.equals(f2));
解決策:
比較には常に関数参照またはラムダ式を使用してください。この問題を回避してください。
罠 3: 非同期関数の比較
同時環境での関数の実行順序は予測できません。したがって、非同期関数の結果を比較すると、信頼性の低い出力が生成される可能性があります。
コード例:
CompletableFuture<Integer> cf1 = CompletableFuture.supplyAsync(() -> 1); CompletableFuture<Integer> cf2 = CompletableFuture.supplyAsync(() -> 1); // 输出: 可能为 true 或 false System.out.println(cf1.equals(cf2));
解決策:
同時環境では非同期関数の結果を比較しないでください。
実際のケース:
2 つの文字列演算関数を比較:
Function<String, String> upperCase = String::toUpperCase; Function<String, String> toLowerCase = String::toLowerCase; // 输出: true System.out.println(upperCase.equals(toUpperCase));
2 つの数学関数を比較:
Function<Double, Double> sine = Math::sin; Function<Double, Double> cosine = Math::cos; // 输出: false System.out.println(sine.equals(cosine));
結論:
Java 関数比較の落とし穴を理解することは、堅牢で予測可能なコードを作成するために重要です。これらのガイドラインに従うことで、エラーを回避し、コードの明確さを向上させることができます。
以上がJava 関数の比較におけるよくある落とし穴と間違いを探るの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。