JAVA 8引用实例方法. vals [i]如何在“InstanceMethWithObjectRefDemo.counter”中自动映射到此

我正在读它的
Java书我得到了这段代码.我知道如何引用方法,但这个让我头疼.我不知道if(f.func(vals [i],v))中的vals [i]如何对映射函数起作用.

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

最佳答案 在这种情况下,HighTemp :: sameTemp等同于(t1,t2) – > t1.sameTemp(T2).

documentation中,它被称为对特定类型的任意对象的实例方法的引用

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

String[] stringArray = { “Barbara”, “James”, “Mary”, “John”,
“Patricia”, “Robert”, “Michael”, “Linda” };
Arrays.sort(stringArray, String::compareToIgnoreCase);

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).

点赞