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

Java 8中的功能接口的定义

益银龙
2023-03-14
问题内容

Java 8中功能接口的定义说:

功能性接口被定义为具有任何接口恰好 一个明确声明的抽象方法。(由于接口可能具有非抽象的默认方法,因此必须进行限定。)这就是为什么功能接口以前称为“单一抽象 方法(SAM)”接口的原因,该术语有时仍然可见。

那么我们为什么这样:

List<Double> temperature = 
   new ArrayList<Double>(Arrays.asList(new Double[] { 20.0, 22.0, 22.5 }));
temperature.sort((a, b) -> a > b ? -1 : 1);

作为中的sort方法List是:

default void sort(Comparator<? super E> c) {
        Object[] a = this.toArray();
        Arrays.sort(a, (Comparator) c);
        ListIterator<E> i = this.listIterator();
        for (Object e : a) {
            i.next();
            i.set((E) e);
        }
    }

lambda表达式表示:

Lambda表达式应可分配给功能接口

该Comparator接口有两个抽象方法,分别是compareequals并用注释@FunctionalInterface。这是否违反了仅具有一种抽象方法的功能接口的定义?


问题答案:

该Comparator接口确实有2个抽象方法。但是其中之一是equals,它会覆盖类中equals定义的方法Object,并且此方法不计在内。

来自@FunctionalInterface:

如果接口声明的抽象方法覆盖的公共方法之一java.lang.Object,则该方法也不会计入接口的抽象方法计数,因为该接口的任何实现都将具有来自java.lang.Object其他地方的实现。

这样,这使Comparator接口成为功能方法所在的功能接口compare(o1, o2)。

lambda表达式(a, b) -> a > b ? -1 : 1符合该协定:它声明2个参数并返回int。



 类似资料:
  • 更准确地说,函数接口定义为具有一个抽象方法的任何接口。 然后他继续介绍示例,其中一个是接口: 我能够测试是否可以使用lambda函数代替比较器参数,并且它能够工作(例如)。

  • 问题内容: 关于Java8 内置 功能接口,我遇到了许多问题,包括this,this和this。但是所有人都问“为什么只有一种方法?” 或“如果使用功能接口执行X,为什么会出现编译错误”等。我的问题是: 当我仍然可以在自己的接口中使用lambda时,这些新功能接口的存在目的 是 什么 ? 考虑一下oracle文档中的以下示例代码: 好的,很好,但这可以通过上面自己的示例来实现(带有单个方法的接口已

  • 还是这些标准的功能接口(消费者、供应商、谓词、函数)是用来充当代码组织、可读性、结构、[其他]的模板?

  • 在Java8中,新的包是Java。util。函数包含很多函数接口。该软件包的文档(http://docs.oracle.com/javase/8/docs/api/java/util/function/package-summary.html)多次提到“函数形状”: 有几种基本函数形状,包括函数(从T到R的一元函数)、消费者(从T到void的一元函数)、谓词(从T到布尔的一元函数)和供应者(从T到

  • 有了钩子,功能性React组件不再是无状态组件。它可以有状态,所以为功能组件定义状态接口是有意义的。 虽然打字稿不会抛出任何错误/警告,但最好定义一下。 需要帮助做同样的事情。