当前位置: 首页 > 知识库问答 >
问题:

Java如何知道在使用lambda表达式时应该重写哪个方法

丘智志
2023-03-14

在JAVA8中,可以用lambda表达式替换内部类。

Comparator c = (a, b) -> Integer.compare(a.length(), b.length());

Runnable java8Runner = () ->{System.out.println("I am running");};

jvm怎么知道,这个lambda应该重写正确的方法?在上述示例中,它们是run()compare()

共有2个答案

东方和煦
2023-03-14

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类会这样做。

萧晔
2023-03-14

这是通过单一方法接口实现的。这些接口中只有一个(抽象)方法。如果存在歧义,则不能使用缩写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循环,而不是循环所有元素?