Je suis nouveau à java8 et je tentais de comprendre ce morceau de code. Ceci est le morceau de code:
Stream.of("A", "B", "C").anyMatch(someObj.getStringValue()::equalsIgnoreCase)
someObj.getStringValue()
références un objet et les getStringValue()
renvoie une valeur chaîne.
Quel est le prédicat équivalent de la référence de la méthode étant passé dans anyMatch(...)
?
Si je comprends bien cela équivaudrait à:
Predicate<String> p = new Predicate<String>() {
@Override
public boolean test(String t) {
return someObject.getStringValue().equalsIgnoreCase(t);
}
}
Stream.of("A", "B", "C").anyMatch(p)
Avec cela , je reçois l'erreur « Variable locale someObject
définie dans un champ englobante doit être définitive ou efficace finale. » Toute explication à ce sujet est apprécié.
L' someObj.getStringValue()
expression est évaluée à l' extérieur, de sorte que le code équivalent serait:
final String x = someObject.getStringValue();
Predicate<String> p = new Predicate<String>() {
@Override
public boolean test(String t) {
return x.equalsIgnoreCase(t);
}
}
Stream.of("A", "B", "C").anyMatch(p)
où la variable locale x
est « anonyme » aussi.
À cause de cela, someObject
n'a pas besoin d'être efficacement finale .
Vous pouvez vérifier ce comportement pour l' expression lambda dans un débogueur, en mettant un à l' intérieur des points d'arrêt getStringValue()
. Même si la test()
méthode est appelée 3 fois (parce que le flux a 3 éléments, et en supposant aucune correspondance), la getStringValue()
méthode ne sera appelée une fois.