功能接口
功能接口是只有一个抽象方法的简单接口。那么,要使用的大事是用于实施其行为,而无需为其创建另一个类,甚至需要匿名类,这可以减少代码的行数并使其更容易阅读。
每个接口都只有一个抽象方法是一个功能接口。但是,在接口声明中使用@FunctionalInterface
注释是一个好习惯,因为那个使Java编译器会引发错误,以防注释的接口具有多个抽象方法,或者如果其类型不是interface
。
使用该类型的实现的另一个间接优势是支持具有并行操作的流,可以改善我们的软件性能。
使用示例。
让我们创建一个简单的示例。如前所述,如果接口只有一个抽象方法,则可以是功能接口。牢记它,接口MyFuncionalInterface
具有以下代码:
@FunctionalInterface // Makes the compiler throws an error.
interface MyFuncionalInterface {
public double calculate(double num1, double num2);
}
要实现该calculate
方法,我们可以创建一个新类或使用匿名类,例如通常。但是,由于它是一个功能接口,因此我们可以使用lambdas实现该方法。
以下代码片段显示了两个实现:使用匿名类和使用lambdas。
class Application {
public static void main(String args[]) {
double num1 = Double.valueOf(args[0]);
double num2 = Double.valueOf(args[1]);
// Implementation with anonymous class.
MyFuncionalInterface calcWithAnonymousClass = new MyFuncionalInterface() {
@Override
public double calculate(double num1, double num2) {
return num1 + num2;
}
};
// Implementation with lambda.
MyFuncionalInterface calcWithLamba = (parameter1, parameter2) -> parameter1 + parameter2;
double resultWithAnonymousClass = calcWithAnonymousClass.calculate(num1, num2);
double resultWithLambda = calcWithLamba.calculate(num1, num2);
System.out.println("The sum between " + num1 + " and " + num2 + " is:");
System.out.println("Anonymous Class: " + resultWithAnonymousClass);
System.out.println("Lamba: " + resultWithLambda);
}
}
对于运行该代码,我们可以在Application.java
文件的位置使用以下命令。
javac Application.java; java Application 1 1
运行后,在终端显示的结果为:
The sum between 1.0 and 1.0 is:
Anonymous Class: 2.0
Lamba: 2.0
请注意,对calcWithAnonymousClass
的实现需要更多的行才能制作与calcWithLamba
相同的东西。使用功能接口和lambdas是很大的一面:更少的代码和更多的可读性。
当然,在我们的日常生活中,由于许多原因,许多班级都无法以功能的方式实施:旧版代码,依赖性甚至缺乏知识。该资源非常有用,但是在正确的位置。
感谢您的阅读,任何建议都是有效的,请让您的反馈;)。
您可以在GitHub
上检查代码参考
该帖子基于Vogella's introduction about Java,Marcelo Carvalho post on Medium,Oracle Documentation和Pankaj post on Digital Ocean。