Java 関数の比較におけるよくある落とし穴と間違いを探る

王林
リリース: 2024-04-19 21:54:01
オリジナル
997 人が閲覧しました

オブジェクト参照が関数参照と等しくありません: 関数を比較するには、equals() メソッドを使用してください。関数参照はラムダ式と一貫性がありません。比較には常に一貫した型 (関数参照またはラムダ) を使用してください。非同期関数の比較は信頼性が低い: 同時環境で非同期関数の結果を比較しないでください。

Java 関数の比較におけるよくある落とし穴と間違いを探る

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 サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート