请使用类名解释Java 8方法参考实例方法

Abu*_*que 8 java java-8 functional-interface method-reference

public interface MyFunc<T> {

    boolean func(T v1, T v2);

}
Run Code Online (Sandbox Code Playgroud)
public class HighTemp {

    private int hTemp;

    HighTemp(){

    }
    public HighTemp(int ht) {
        this.hTemp = ht;
    }

    boolean sameTemp(HighTemp ht2){
         return hTemp == ht2.hTemp;
    }

     boolean lessThanTemp(HighTemp ht2){
        return hTemp < ht2.hTemp;
    }
}
Run Code Online (Sandbox Code Playgroud)
class InstMethWithObjRef {

    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)};
        count = counter(weekDayHighs, HighTemp::lessThanTemp,new HighTemp(89));     
        System.out.println(count);          
    }
}
Run Code Online (Sandbox Code Playgroud)

请解释一下

  1. boolean sameTemp()与func()功能界面兼容.
  2. sameTemp()方法func()在功能界面中实现.
  3. count = counter(weekDayHighs, HighTemp::sameTemp, new HighTemp(89)); 工作中

请分别解释所有要点.

Cod*_*roc 7

等价的 lambda表达式HighTemp::lessThanTemp是

(highTemp1, highTemp2) -> {
     return highTemp1.lessThanTemp(highTemp2);
} 
Run Code Online (Sandbox Code Playgroud)

这是对特定类型的任意对象的实例方法的Java8命名引用的特征之一


考虑以下示例,

interface FIface<T> {
    int testMethod(T a, T b);
}

class Test2 {

    private String str;

    Test2(String str) {
        this.str = str;
    }

    int ok(Test2 test2) {
        System.out.println("Currnet String : "+ this.str);//Refer to t1
        System.out.println("Test String : "+test2.str);//Refer to t2
        return 0;
    }

}

public class Test {

    public static <T> int checkCall(T t1, T t2, FIface<T> fiFace) {
        //Here Test2 :: ok is equivalent to t1.ok(t2)
        return fiFace.testMethod(t1, t2);
    }

    public static void main(String[] args) {
        checkCall(new Test2("a"), new Test2("b"), Test2 :: ok);
    }

}
Run Code Online (Sandbox Code Playgroud)

OUTPUT

Currnet String : a
Test String : b
Run Code Online (Sandbox Code Playgroud)

注意这里Test2 :: ok对于调用有效甚至ok方法不是静态的.

当你调用该方法checkCall的功能界面,你仍然有两个参数,其是t1与t2并为有效的lambda表达式可以有参数,(Test t1, Test t2)所以你的方法Test2 :: ok这里成为有效的呼叫.在内部,它以这种方式工作t1.ok(t2).

所以,fiFace.testMethod(t1, t2);将调用方法作为t1.ok(t2)