2016-12-08 2 views
4

Je suis un peu confus à propos de cette syntaxe de référence de méthode.Confusion à propos de la référence de méthode à deux arguments

counter() attend BiFunction mais HighTemp::lessThanTemp est un argument valide malgré HighTemp.lessThanTemp() prenant seulement un argument.

Que se passe-t-il exactement dans la ligne: if (f.func(vals[i], v))?

MCVE:

import java.util.function.BiFunction; 

class Demo { 
    static class HighTemp { 
    private int hTemp; 

    HighTemp(int ht) { hTemp = ht; } 

    boolean lessThanTemp(HighTemp ht2) { 
     return hTemp < ht2.hTemp; 
    } 
    } 

    static <T> int counter(T[] vals, BiFunction<T,T,Boolean> f, T v) { 
    int count = 0; 

    for (int i=0; i < vals.length; i++) { 
     if (f.apply(vals[i], v)) { // THIS LINE 
     count++; 
     } 
    } 

    return count; 
    } 

    public static void main(String args[]) {  
    HighTemp[] weekDayHighs2 = { new HighTemp(32), new HighTemp(12), 
           new HighTemp(24), new HighTemp(19), 
           new HighTemp(18), new HighTemp(12), 
           new HighTemp(-1), new HighTemp(13) }; 

    int count = counter(weekDayHighs2, HighTemp::lessThanTemp, new HighTemp(19)); 
    System.out.println(count + " days had a high of less than 19"); 
    } 
} 
+0

Astuce: au lieu de définir votre propre interface 'MyFunc', utilisez [' BiFunction'] (https://docs.oracle .com/javase/8/docs/API/java/util/function/BiFunction.html) ou son sous-type ['BinaryOperator'] (https://docs.oracle.com/javase/8/docs/api/java/ util/function/BinaryOperator.html). – dimo414

+0

@ dimo414 le résultat de compilation est "5 jours avaient un maximum de moins de 19". Je suis confus sur comment cela fonctionne réellement – KuKKi

+0

@JimGarrison le 'f.func (vals [i], v)' prend deux arguments, mais n'est-ce pas le f.func est appelé 'HighTemp :: lessThanTemp' , qui ne prend qu'un argument. 'boolean lessThanTemp (HighTemp ht2)' – KuKKi

Répondre

3

Jetez un oeil à la relevant documentation, qui note:

L'expression lambda équivalent pour la référence de la méthode String::compareToIgnoreCase aurait la liste de paramètres formels (String a, String b), où a et b sont des noms arbitraires utilisés pour mieux décrire cet exemple. La référence de méthode appelait la méthode a.compareToIgnoreCase(b).

En d'autres termes, HighTemp::lessThanTemp est équivalente à l'expression lambda:

(a, b) -> a.lessThanTemp(b) 
+1

Et pour référence [JLS 15.13.3] (http://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.13.3). _Si le formulaire est ReferenceType :: [TypeArguments] Identifier .... Si la déclaration de compilation est une méthode d'instance, la référence cible est le premier paramètre formel de la méthode d'appel_ –