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

时间:2016-10-13 16:10:25

标签: java java-8

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

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

1 个答案:

答案 0 :(得分:2)

在此上下文中,HighTemp::sameTemp相当于(t1, t2) -> t1.sameTemp(t2)

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

  

以下是对特定类型的任意对象的实例方法的引用示例:

     

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

     

方法引用String :: compareToIgnoreCase的等效lambda表达式将具有形式参数列表(String a,String b),其中a和b是用于更好地描述此示例的任意名称。方法引用将调用方法a.compareToIgnoreCase(b)。

相关问题