This question already has answers here:
Instance Method Reference and Lambda Parameters

(2个答案)


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");
  }
}

最佳答案

看一看relevant documentation,它指出:



换句话说,HighTemp::lessThanTemp等同于lambda表达式:

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

09-15 18:25