2016-12-08 3 views
4

Я немного смущен этим синтаксисом ссылки на метод.Путаница о методе с двумя аргументами

counter() ожидает BiFunction однако HighTemp::lessThanTemp является допустимым аргументом, несмотря на то, что HighTemp.lessThanTemp() принимает только один аргумент.

Что именно происходит в линии: 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

Подсказка: вместо определения собственного 'MyFunc' интерфейс, используйте [' BiFunction'] (https://docs.oracle .com/javase/8/docs/api/java/util/function/BiFunction.html) или его подтип ['BinaryOperator'] (https://docs.oracle.com/javase/8/docs/api/java/ Util/функция/BinaryOperator.html). – dimo414

+0

@ dimo414 результат компиляции - «5 дней имели максимум менее 19». Я смущен, как это работает – KuKKi

+0

@JimGarrison 'f.func (vals [i], v)' принимает два аргумента, но не означает, что f.func ссылается на 'HighTemp :: lessThanTemp' , которые принимают только один аргумент. 'boolean lessThanTemp (HighTemp ht2)' – KuKKi

ответ

3

Посмотрите на relevant documentation, в котором отмечается:

Эквивалент лямбда-выражения для задания метода String::compareToIgnoreCase будет иметь список формальных параметров (String a, String b), где a и b это произвольные имена, используемые для лучшего описания этого примера. Ссылка на метод вызовет метод a.compareToIgnoreCase(b).

Других слов, HighTemp::lessThanTemp эквивалентно выражение лямбды:

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

И для справки [JLS 15.13.3] (http://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.13.3). _ Если форма ReferenceType :: [TypeArguments] Идентификатор .... Если объявление времени компиляции является методом экземпляра, то целевая ссылка является первым формальным параметром метода invoke_ –

Смежные вопросы