Confusion over the reference to two arguments

I am a little confused by this method reference syntax.

counter()expecting BiFunctionhowever HighTemp::lessThanTempis a valid argument, although it HighTemp.lessThanTemp()accepts only one argument.

What exactly happens on the line 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");
  }
}
+4
source share
1 answer

Take a look at the relevant documentation , which notes:

- String::compareToIgnoreCase (String a, String b), a b - , . a.compareToIgnoreCase(b).

, HighTemp::lessThanTemp -:

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

Source: https://habr.com/ru/post/1663186/


All Articles