Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Confusion about two-argument method reference [duplicate]

I am a bit confused about this method reference syntax.

counter() expects a BiFunction however HighTemp::lessThanTemp is a valid argument despite HighTemp.lessThanTemp() only taking one argument.

What exactly is happening in 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");
  }
}
like image 489
Lv.0 Shian Avatar asked Dec 08 '16 02:12

Lv.0 Shian


1 Answers

Take a look at the relevant documentation, which notes:

The equivalent lambda expression for the method reference String::compareToIgnoreCase would have the formal parameter list (String a, String b), where a and b are arbitrary names used to better describe this example. The method reference would invoke the method a.compareToIgnoreCase(b).

In other words, HighTemp::lessThanTemp is equivalent to the lambda expression:

(a, b) -> a.lessThanTemp(b)
like image 124
dimo414 Avatar answered Nov 07 '22 15:11

dimo414