Java 8 特性 - 功能界面简介
功能性接口是Java 8中引入的新概念。
从名字上看,它是一个只包含抽象方法的接口。 这个接口的实例是由lambda表达式、方法引用和构造器引用创建的。这是在Java 8中引入的函数式编程的概念。在Java 8中,它允许创建一个自定义的函数式接口,以及由Java 8提供的内置函数式接口。
特点
- 它只包含单一的抽象方法,提出单一的功能
- 可以声明许多默认和静态方法
- 可以声明对象类的方法
- 它可以扩展非功能接口
- 它可以扩展另一个没有任何抽象方法的接口
@FunctionalInterface注解示例
这是为函数式接口引入的一个新注解。它将接口标记为函数式编程。它可以用来在编译阶段检查代码。这个注解并不是必须使用的,你仍然可以在lambda表达式中使用这些接口。
自定义函数接口示例
这是一个创建我们自己的自定义函数接口的例子。
通过注释@FunctionalInterface 创建了MultiplyFunctionalInterface,它只有一个抽象的方法,没有提供实现 写了lambda表达式来实现Functional接口
public class FunctionalInterfaceExample {
public static void main(String[] args) {
MultiplyFunctionalInterface mfi = (value1, value2) -> value1 * value2;
System.out.println(mfi.multiply(5, 6));
}
}
@FunctionalInterface
interface MultiplyFunctionalInterface {
public Integer multiply(Integer value1, Integer value2);
}
预定义的功能接口示例
这是一个使用现有功能接口的例子。LongBinaryOperator是java.util.function包中的一个功能接口。在下面的例子中使用了applyAsLong方法。
import java.util.function.LongBinaryOperator;
public class InbuiltFunctionExamle {
public static void main(String args[]) {
LongBinaryOperator add = (value1, value2) -> value1+ value2;
System.out.println(add.applyAsLong(5, 400));
}
}
功能性接口示例
我们将看到有效和无效的功能接口例子
有效的功能接口例子
下面的例子是一个有效的功能接口,一个方法是单一的抽象方法toString,Object类中的equals可以被覆盖。
@FunctionalInterface
interface MyInterface {
int method(int a, int b);
@Override
public String toString();
@Override
public boolean equals(Object obj);
}
无效的功能接口示例
下面的例子是无效的功能接口,在编译时抛出错误'Invalid '@FunctionalInterface' annotation; is not a functional interface' 下面的接口有两个抽象方法,只允许有一个抽象方法。
@FunctionalInterface
interface InvalidFunctionalInterface {
public Integer method(Integer value1, Integer value2);
public Integer method1(Integer value1, Integer value2);
}
这个函数式接口正在扩展另一个非函数式接口,它有一个抽象方法。如果它上面没有抽象方法,它应该是有效的。
interface NonFunctionalInterface{
void method();
}
@FunctionalInterface
interface FunctionalInterfaceHello extends NonFunctionalInterface{
void method1();
}