Java 8中使用的功能接口是什么?

Java 8中使用的功能接口是什么?,java,lambda,java-8,functional-interface,Java,Lambda,Java 8,Functional Interface,我在Java8中遇到了一个新术语:“功能接口”。在处理lambda表达式时,我只能找到它的一个用法 Java8提供了一些内置的功能接口,如果我们想定义任何功能接口,那么我们可以使用@functioninterface注释。它只允许我们在接口中声明一个方法 例如: @FunctionalInterface interface MathOperation { int operation(int a, int b); } var myFunction = function (...) {

我在Java8中遇到了一个新术语:“功能接口”。在处理lambda表达式时,我只能找到它的一个用法

Java8提供了一些内置的功能接口,如果我们想定义任何功能接口,那么我们可以使用
@functioninterface
注释。它只允许我们在接口中声明一个方法

例如:

@FunctionalInterface
interface MathOperation {
    int operation(int a, int b);
}
var myFunction = function (...) {
    ...;
}
alert(myFunction(...));
除了使用lambda表达式,它在Java8中有多有用


(这个问题与我问的不同。它问我们为什么在使用lambda表达式时需要函数接口。我的问题是:除了使用lambda表达式之外,函数接口还有什么其他用途?

一点也不。Lambda表达式是该注释的唯一点。

@functioninterface
注释对于代码的编译时检查非常有用。除了
静态
默认
和在
@functional接口
或用作功能接口的任何其他接口中重写
对象
中方法的抽象方法之外,您不能有多个方法

但是您可以在不使用此注释的情况下使用lambda,也可以在不使用
@override
注释的情况下重写方法

来自文档

函数接口只有一个抽象方法。自违约以来 方法有一个实现,它们不是抽象的。如果一个接口 声明一个抽象方法,该方法重写 对象,这也不计入接口的 抽象方法计数,因为接口的任何实现都将 从java.lang.Object或其他地方获得实现

可在lambda表达式中使用

public interface Foo {
  public void doSomething();
}
public interface Foo {
  public void doSomething();
  public void doSomethingElse();
}
不能在lambda表达式中使用此

public interface Foo {
  public void doSomething();
}
public interface Foo {
  public void doSomething();
  public void doSomethingElse();
}
但这将导致编译错误

@FunctionalInterface
public interface Foo {
  public void doSomething();
  public void doSomethingElse();
}
“@FunctionInterface”批注无效;Foo不是一个功能性的 接口


lambda表达式可以指定给函数接口类型,但方法引用和匿名类也可以指定

java.util.function
中特定函数接口的一个优点是,它们可以组合起来创建新函数(如
function.and
function.compose
谓词和
等)由于它们包含方便的默认方法。

这些方法的目的确实有所不同

一种信息性注释类型,用于指示接口类型声明是由Java语言规范定义的功能接口

以及用例

请注意,可以使用lambda表达式、方法引用或构造函数引用创建函数接口的实例

其措辞一般不排除其他用例。由于主要目的是指示函数接口,因此您的实际问题归结为“除了lambda表达式和方法/构造函数引用之外,函数接口还有其他用例吗?”

由于functional interface是Java语言规范定义的Java语言结构,因此只有该规范才能回答该问题:

:

除了通过声明和实例化类(§15.9)创建接口实例的常规过程外,还可以使用方法引用表达式和lambda表达式(§15.13,§15.27)创建函数接口实例

因此Java语言规范没有说其他的,该部分提到的唯一用例是使用方法引用表达式和lambda表达式创建接口实例。(这包括构造函数引用,因为它们在规范中被称为方法引用表达式的一种形式)


所以在一句话中,不,在Java8中没有其他的用例。

正如其他人所说,功能接口是一个公开一种方法的接口。它可能有多个方法,但所有其他方法都必须有一个默认实现。它之所以被称为“功能接口”,是因为它实际上是一个函数。由于可以将接口作为参数传递,这意味着函数现在像函数式编程语言一样是“一流公民”。这有很多好处,在使用流API时您会看到很多好处。当然,lambda表达式是它们的主要明显用途。

@functioninterface
是Java 8发布的新注释,为lambda表达式提供目标类型,并用于代码的编译时检查

当您想使用它时:

1-您的接口不能有多个抽象方法,否则将出现编译错误

1-您的接口应该是纯的,这意味着功能接口打算由无状态类实现,例如纯的是
比较器
接口,因为它不依赖于实现者的状态,在这种情况下不会给出编译错误,但在许多情况下,您将无法将lambda用于此类接口

java.util.function
包包含各种通用功能接口,如
谓词
消费者
函数
供应商


另外请注意,您可以使用lambdas而不使用此注释。

除了其他答案之外,我认为“为什么使用函数接口而不是直接使用lambda表达式”的主要原因可能与面向对象的Java语言的性质有关

Lambda表达式的主要属性有:1。它们可以在2点左右传递。它们可以在未来的特定时间内执行(多次)。现在来支持这一点
package com.akhi;
    @FunctionalInterface
    public interface FucnctionalDemo {

      void letsDoSomething();
      //void letsGo();      //invalid because another abstract method does not allow
      public String toString();    // valid because toString from Object 
      public boolean equals(Object o); //valid

      public static int sum(int a,int b)   // valid because method static
        {   
            return a+b;
        }
        public default int sub(int a,int b)   //valid because method default
        {
            return a-b;
        }
    }
   interface CalcArea {   // --functional interface
        double calcArea(double rad);
    }           
interface CalcGeometry { // --functional interface
    double calcArea(double rad);
    default double calcPeri(double rad) {
        return 0.0;
    }
}       
interface CalcGeometry {  // -- not functional interface
    double calcArea(double rad);
    double calcPeri(double rad);
}