当前位置: 首页 > 面试题库 >

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

於子晋
2023-03-14
问题内容
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)); 正在工作

请单独解释所有要点。


问题答案:

__HighTemp::lessThanTemp is的 等效 lambda表达式

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

这是
特定类型的任意对象的实例方法的
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);
    }

}

输出值

Currnet String : a
Test String : b

请注意,这Test2 :: ok对于call even ok方法不是静态的有效。

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

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



 类似资料:
  • 本文向大家介绍使用Java8中的方法引用来引用实例方法,包括了使用Java8中的方法引用来引用实例方法的使用技巧和注意事项,需要的朋友参考一下 Java中的Lambda表达式使您可以将功能作为参数传递给方法。您也可以使用lambda表达式调用现有方法。 方法引用是简单,易于阅读的lambda表达式,可通过lambda表达式中的名称来调用/引用和现有方法。 语法 以下是在Java中引用实例方法的语法

  • 我正在通过一个例子,它从与方法引用相关的当前目录中提取一个隐藏文件数组,如下所述 使用匿名内部类实现 使用方法参考实现 我的问题是接口只有一个抽象方法(),而实现accept-method-using-method-reference在类中使用的有效性如何。我了解到,只有当参数与抽象方法匹配时,我们才能应用方法引用,但是这里method有一个类型的参数,但是没有参数。你能解释一下它的有效性吗。

  • 主要内容:1 Java8 方法引用的介绍,2 Java8 方法引用的分类,3 Java8 方法引用:引用静态方法,4 Java8 方法引用:引用实例方法,5 Java8 方法引用:引用构造方法1 Java8 方法引用的介绍 Java提供了一个新功能,称为Java 8中的方法引用。方法引用用于引用功能接口的方法。它是lambda表达式的紧凑和简单形式。每次使用lambda表达式仅引用方法时,都可以将lambda表达式替换为方法引用。在本教程中,我们将详细解释方法参考概念。 2 Java8 方法引用

  • 本文向大家介绍对python:threading.Thread类的使用方法详解,包括了对python:threading.Thread类的使用方法详解的使用技巧和注意事项,需要的朋友参考一下 Python Thread类表示在单独的控制线程中运行的活动。有两种方法可以指定这种活动: 1、给构造函数传递回调对象 2、在子类中重写run() 方法 这里举个小例子: 派生类中重写了父类threading

  • 在Java8中,我们可以引用Class实例的方法 a是类的一个实例,其方法是。 我们能在科特林做同样的事吗?我尝试了同样的语法,但没有成功。到目前为止,我只能创建一个扩展方法引用,如下所示: 但在这里,我仍然需要一个

  • } ---编辑1--更改 根据注释,断言是失败的。