请解释Java 8方法引用使用类名的实例方法

2024-01-17

public interface MyFunc<T> {

    boolean func(T v1, T v2);

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

请解释一下如何

  1. boolean sameTemp()兼容于func()在功能界面中。
  2. sameTemp()方法已实施于func()在函数式接口中。
  3. count = counter(weekDayHighs, HighTemp::sameTemp, new HighTemp(89));工作中

请分别解释所有要点。


相等的的 lambda 表达式HighTemp::lessThanTemp is

(highTemp1, highTemp2) -> {
     return highTemp1.lessThanTemp(highTemp2);
} 

这是其特点之一Java8 named 对特定类型的任意对象的实例方法的引用 https://docs.oracle.com/javase/tutorial/java/javaOO/methodreferences.html


考虑下面的例子,

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

}

OUTPUT

Currnet String : a
Test String : b

这里请注意Test2 :: ok甚至对通话有效ok方法不是静态的。

当你调用该方法时checkCall对于函数式接口,你仍然有两个参数:t1 and t2对于有效的 lambda 表达式,其参数可以为(Test t1, Test t2)所以你的方法Test2 :: ok这里对调用有效。在内部它是这样工作的t1.ok(t2).

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

请解释Java 8方法引用使用类名的实例方法 的相关文章

随机推荐