Java 8中使用的功能接口是什么?
我在Java8中遇到了一个新术语:“功能接口”。在处理lambda表达式时,我只能找到它的一个用法 Java8提供了一些内置的功能接口,如果我们想定义任何功能接口,那么我们可以使用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 (...) {
@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);
}