Comment mettre en œuvre la méthode de référence comme un prédicat?

user3303411:

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 someObjectdéfinie dans un champ englobante doit être définitive ou efficace finale. » Toute explication à ce sujet est apprécié.

Andreas:

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 xest « anonyme » aussi.

À cause de cela, someObjectn'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.

Je suppose que tu aimes

Origine http://43.154.161.224:23101/article/api/json?id=313032&siteId=1
conseillé
Classement