JAVA 8 Link to instance methods. How vals [i] automatically maps to this in "InstanceMethWithObjectRefDemo.counter"

I am reading a java book. I got this code. I know how method references are made, but it gives me a headache. I do not know how vals[i]in if(f.func(vals[i], v))acts as thisfor the displayed function.

// Use an instance method reference with different objects. 
// A functional interface that takes two reference arguments 
// and returns a boolean result.
interface MyFunc<T> { 
    boolean func(T v1, T v2); 
}
// A class that stores the temperature high for a day. 
class HighTemp { 
    private int hTemp; 
    HighTemp(int ht) {
    hTemp = ht;
} 

// Return true if the invoking HighTemp object has the same 
// temperature as ht2.
boolean sameTemp(HighTemp ht2) { 
    return hTemp == ht2.hTemp; 
}
// Return true if the invoking HighTemp object has a temperature 
// that is less than ht2. 
boolean lessThanTemp(HighTemp ht2) { 
    return hTemp < ht2.hTemp; 
} 
} 
class InstanceMethWithObjectRefDemo { 
// A method that returns the number of occurences 
// of an object for which some criteria, as specified by 
// the MyFunc parameter, is true. 
static <T> int counter(T[] vals, MyFunc<T> f, T v) { 
    int count = 0; 
    for(int i=0; i < vals.length; i++) {
    if(f.func(vals[i], v)) count++; 
    }
    return count;   
} 

public static void main(String args[]) { 
    int count;
    // Create an array of HighTemp objects. 
    HighTemp[] weekDayHighs = { new HighTemp(89), new HighTemp(82), 
                            new HighTemp(90), new HighTemp(89), 
                            new HighTemp(89), new HighTemp(91), 
                            new HighTemp(84), new HighTemp(83) }; 

    // Use counter() with arrays of the class HighTemp. 
    // Notice that a reference to the instance method 
    // sameTemp() is passed as the second argument. 
    count = counter(weekDayHighs, HighTemp::sameTemp,new HighTemp(89)); 
    System.out.println(count + " days had a high of 89"); 

    // Now, create and use another array of HighTemp objects. 
    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) }; 

    count = counter(weekDayHighs2, HighTemp::sameTemp,new HighTemp(12)); 
    System.out.println(count + " days had a high of 12"); 
    // Now, use lessThanTemp() to find days when temperature was less 
    // that a specified value.
    count = counter(weekDayHighs, HighTemp::lessThanTemp,new        HighTemp(89)); 
    System.out.println(count + " days had a high less than 89"); 
    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

In this context is HighTemp::sameTempequivalent (t1, t2) -> t1.sameTemp(t2).

It is known in the documentation as a reference to an instance method of an arbitrary object of a certain type.

The following is an example of a reference to an instance method of an arbitrary object of a certain type:

String [] stringArray = { "", "", "", "",      "", "", "", "" }; Arrays.sort(stringArray, String:: compareToIgnoreCase);

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

+1

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


All Articles