La référence de l'objet n'est pas égale à la référence de la fonction : utilisez la méthode equals() pour comparer les fonctions. Les références de fonction sont incohérentes avec les expressions lambda : utilisez toujours un type cohérent (référence de fonction ou lambda) à des fins de comparaison. La comparaison de fonctions asynchrones n'est pas fiable : ne comparez pas les résultats des fonctions asynchrones dans un environnement concurrent.
Explorez les pièges et les erreurs courants dans la comparaison de fonctions Java
La comparaison de fonctions en Java peut présenter un comportement inattendu, conduisant à des bugs et à un code difficile à comprendre. Comprendre ces pièges potentiels est essentiel pour éviter de tels problèmes.
Piège 1 : la référence d'objet n'est pas égale à la référence de fonction
Même si deux fonctions ont la même fonction, la référence d'objet n'est pas égale à la référence de fonction. Lors de la comparaison des références d'objets à l'aide de l'opérateur ==
, false
sera toujours renvoyé. ==
运算符比较对象引用时,将始终返回 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:函数引用与 lambda 表达式不一致
lambda 表达式会创建一个匿名函数,该函数在语法上不同于函数引用。尝试比较 lambda 表达式和函数引用将导致 ClassCastException
Exemple de code :
Function<Integer, Integer> f1 = Integer::parseInt; Function<Integer, Integer> f2 = x -> Integer.parseInt(x); // 抛出 ClassCastException System.out.println(f1.equals(f2));
Solution :
Pour comparer des fonctions, utilisez la méthodeequals()
. Cette méthode compare les fonctions elles-mêmes plutôt que leurs références. Code modifié :
CompletableFuture<Integer> cf1 = CompletableFuture.supplyAsync(() -> 1); CompletableFuture<Integer> cf2 = CompletableFuture.supplyAsync(() -> 1); // 输出: 可能为 true 或 false System.out.println(cf1.equals(cf2));
Piège 2 : les références de fonction sont incohérentes avec les expressions lambda
Les expressions lambda créent une fonction anonyme qui est syntaxiquement différente d'une référence de fonction. Tenter de comparer une expression lambda et une référence de fonction entraînera une ClassCastException
.
Exemple de code :
Function<String, String> upperCase = String::toUpperCase; Function<String, String> toLowerCase = String::toLowerCase; // 输出: true System.out.println(upperCase.equals(toUpperCase));
Solution :
Utilisez toujours des références de fonction ou des expressions lambda pour les comparaisons afin d'éviter ce problème.
Piège 3 : Comparaison des fonctions asynchrones
L'ordre d'exécution des fonctions dans un environnement concurrent est imprévisible. Par conséquent, la comparaison des résultats des fonctions asynchrones peut produire une sortie peu fiable.Exemple de code :
Function<Double, Double> sine = Math::sin; Function<Double, Double> cosine = Math::cos; // 输出: false System.out.println(sine.equals(cosine));
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!