Xia*_*kun 2 java lambda java-8
使用JAVA8,内部类可以用lambda表达式替换.
Comparator c = (a, b) -> Integer.compare(a.length(), b.length());
Runnable java8Runner = () ->{System.out.println("I am running");};
Run Code Online (Sandbox Code Playgroud)
jvm怎么知道,这个lambda应该覆盖正确的方法?在上面的例子中,它们是run()和compare().
这通过单方法接口来实现.这些接口中只有一个(抽象)方法.如果存在歧义,则不能使用速记lambda语法.
您可以使用@FunctionalInterface注释让编译器对接口强制执行此操作(但是没有必要,即使没有它,接口也可以在lambdas中使用).
Thilo是对的.
尽管如此,这个词
单方法接口
因为功能接口可能有多个方法,所以不太合适:可能有多个默认方法,但只有一个和一个抽象方法.
例如,它是一个有效的功能接口:
@FunctionalInterface
public interface MyInterface {
Integer getResult();
default boolean isNoResult(){
return getResult()==null;
}
}
Run Code Online (Sandbox Code Playgroud)
表达式lambda只能在功能接口的上下文中使用.功能接口是指定一个和单个抽象方法的Java接口.在您的示例中,Comparator和Runnable只有一个抽象方法.更多细节:https://docs.oracle.com/javase/8/docs/api/java/lang/FunctionalInterface.html
jvm怎么知道,这个lambda应该覆盖正确的方法?在上面的例子中,它们是run()和compare().
如果你使用一个没有功能接口的lambda表达式,那么编译就会出错:编译器确实会用显式消息来抱怨它:
这个表达式的目标类型必须是一个功能接口
因此,即使它不是强制性的,如果您创建一个目标是功能接口的接口,最好使用注释声明它@FunctionalInterface以强制编译器检查它是否是一个有效的功能接口:一个和一个抽象方法.这样,当您的界面是有效的功能界面时,您现在就会知道.
这就是为什么Java 8中的JDK类可以实现的.
| 归档时间: |
|
| 查看次数: |
632 次 |
| 最近记录: |