:: (deux points) opérateur en Java 8

J'ai été d'explorer la Java 8 source et trouvé cette partie de code très surprenant:

//defined in IntPipeline.java
@Override
public final OptionalInt reduce(IntBinaryOperator op) {
    return evaluate(ReduceOps.makeInt(op));
}

@Override
public final OptionalInt max() {
    return reduce(Math::max); //this is the gotcha line
}

//defined in Math.java
public static int max(int a, int b) {
    return (a >= b) ? a : b;
}

Est Math::max quelque chose comme une méthode de pointeur? Comment un normal static méthode converties en IntBinaryOperator?

C'est du sucre syntaxique pour le compilateur de générer automatiquement des implémentations d'interface basé sur la fonction que vous fournissez (pour rendre l'ensemble du lambda truc plus facile à utiliser avec du code existant bases).
java.dzone.com/articles/java-lambda-expressions-vs pourrait aider, n'avait pas l'air de profondeur dans le sujet
ce n'est pas exactement "sucre syntaxique", à moins que vous pouvez dire pour quoi. c'est à dire "x est sucre syntaxique pour y".
il crée un nouvel objet de lambda chaque fois que je l'utilise. TestingLambda$$Lambda$2/8460669 et TestingLambda$$Lambda$3/11043253 ont été créés sur les deux invocations.
Les Lambdas et de la méthode références ne sont pas des "plain old anonyme intérieur des classes". Voir programmers.stackexchange.com/a/181743/59134 . Oui, si nécessaire, de nouvelles classes et des instances sont créées à la volée, si nécessaire, mais seulement si nécessaire.

OriginalL'auteur Narendra Pathai | 2013-11-15