在JAVA8中,可以用lambda表达式替换内部类。
Comparator c = (a, b) -> Integer.compare(a.length(), b.length());
Runnable java8Runner = () ->{System.out.println("I am running");};
jvm怎么知道,这个lambda应该重写正确的方法?在上述示例中,它们是run()
和compare()
。
Thilo是对的。
尽管如此,这个术语
单方法接口
不是更合适,因为函数接口可能有多个方法:可能有多个默认方法,但只有一个抽象方法
例如,它是一个有效的功能接口:
@FunctionalInterface
public interface MyInterface {
Integer getResult();
default boolean isNoResult(){
return getResult()==null;
}
}
表达式lambda只能在函数接口的上下文中使用。函数接口是指定一个抽象方法的Java接口。在您的示例中,Comparator和Runnable只有一个抽象方法。更多详情请点击此处:https://docs.oracle.com/javase/8/docs/api/java/lang/FunctionalInterface.html
jvm怎么知道,这个lambda应该重写正确的方法?在上面的示例中,它们是run()和compare()。
如果您使用一个lambda表达式和一个无函数接口,编译就会出错:编译器确实会用显式消息来抱怨它:
这个表达式的目标类型必须是一个函数接口
因此,即使它不是强制性的,如果您在aim中创建一个接口作为函数接口,那么最好使用注释@functional interface
声明它,以强制编译器检查它是否是有效的函数接口:一个单一的抽象方法。通过这种方式,您现在就可以知道您的接口是一个功能接口,它是否有效
这就是为什么Java8中的JDK类会这样做。
这是通过单一方法接口实现的。这些接口中只有一个(抽象)方法。如果存在歧义,则不能使用缩写lambda语法。
您可以使用@keytionalInterface
注释让编译器对接口强制执行此操作(但这不是必需的,即使没有它,该接口也可以在lambdas中使用)。
首先,我不知道如何得体地表达这个问题,所以这是我的建议。 假设我们有以下重载方法: 离开这张桌子,我又问了一个问题 以下是我在当地得到的结果: 编译器如何知道调用哪个方法?例如,它如何区分什么是和什么是?
目前我学习Springboot。 在这个代码中 我知道这是lambda表达式,但我没有得到原始代码。这不是我的代码。你能让我知道原始代码吗?
我在这里有一段代码,基本上只是创建一个等于参数的线程数,在每个线程中实例化一个MyRunnable对象,将线程添加到线程列表中,然后根据for循环的迭代设置线程的名称。 我的问题是,有没有更干净的方法?是否可以使用流将此功能封装在lambda中?
问题内容: 我正在研究在基于Linux的系统上运行的商业(非开源)C 项目。我需要在C 代码中做一些正则表达式。(我知道:我现在有2个问题。) 问题:定期使用C / C ++进行正则表达式的人推荐我使用哪些库?快速搜索引起了我以下注意: 1)Boost.Regex(我需要阅读Boost软件许可证,但是这个问题与软件许可证无关) 2)C(不是C ++)POSIX正则表达式(#include ,reg
基本上,我有一个列表,它的元素将被一个一个地处理,直到满足某个条件。如果任何元素满足该条件,则应返回,否则返回。该方法如下所示: 有没有一种方法可以在满足条件后立即跳出这个forEach循环,而不是循环所有元素?