当前位置: 首页 > 面试题库 >

Java是否允许将功能接口用作方法?

公孙栋
2023-03-14
问题内容

使用新的java lambda和功能接口的概念,是否可以将这些功能接口视为方法?

interface Func { void execute(int i); }

void call(Func f)
{
    f(1); //instead of f.execute(1);
}

我发现了很多有关实际lambda表达式语法的信息,但与此无关。


问题答案:

你的主张

之前,您的建议已在lambda-dev邮件列表中进行了讨论:

http://mail.openjdk.java.net/pipermail/lambda-dev/2012-February/004518.html

它之所以被拒绝是因为解析器/编译器会出现与歧义有关的各种问题。或用Brian Goetz的话来说:

我认为,归根结底,这只是对功能接口而不是功能类型的承诺感到不舒服,并且试图退缩到一尘不染的中间立场。我不认为这提供了足够的吸引力。

如果您认为这样的“精打细算”功能仍会为Java语言增加价值,则可以在其中一个lambda邮件列表中再次尝试您的运气,也许使用引人注目的参数:-)

替代

这是可能的,但可能不如示例语法所建议的那样优雅。根据Brian Goetz的最新的lambda状态,将在各章中提到方法参考

8方法参考

[…]

9种方法参考

[…]实际上有三种不同的方法引用,每种语法的语法略有不同:

  • 静态方法
  • 特定对象的实例方法
  • 特定类型的任意对象的实例方法

因此,实际上,您的示例必须按照以下方式改写:

interface Func { void execute(int i); }

void call(Block<Integer> block)
{
    block.run(1); //instead of f.execute(1);
}

现在,您可以传递对该execute方法的引用:

// Disclaimer: I didn't check this against a JDK8 compiler...
Func f = (i) -> { ; }; // Empty sample implementation
call(f::execute)

换句话说,“功能”样式将在调用方法的声明站点而不是使用站点上实现。但是,与JavaScript一样,使用站点不必知道中具体方法的名称Func。它只能接受Blockfor方法返回voidCallablefor方法返回值。

注意,在JDK的Mercurial存储库中,情况已经发生了变化。run()正如lambda状态中所提到的,您将再也找不到。其他有趣的类型可以在java.util.functions包中找到:

http://hg.openjdk.java.net/lambda/lambda/jdk/file/tip/src/share/classes/java/util/function



 类似资料:
  • > 当同一主机上的两个进程使用网络套接字通信时,它们的套接字必须使用不同的端口吗? 我想是的,因为套接字由IP地址和端口号标识。如果进程的套接字使用相同的端口,则无法区分它们的套接字,对吗? 但是一个主机可以有多个网络接口,所以有多个IP地址。同一个主机上的多个网络接口是否可以共享一个端口,从而使两个套接字共享同一个端口? 例如,SSH本地端口转发由以下选项指定: 然后本地主机(SSH客户端运行的

  • 在编写了自己的通用功能接口并将其用于lambdas之后,我必须在一种新方法中使用它: 将通用数组作为输入处理,检查其最小长度是否为4 处理我的功能界面的任何实例 处理lambda表达式的任何实例,该表达式接受一个参数,但不返回任何内容 应用于函数接口实例的结果(这里我想我必须使用使用者) 以前从未使用过函数接口,有人能解释一下我应该如何将2个函数接口作为方法参数传递吗? 例如:

  • 问题内容: 但是那里给出的解决方案不起作用。他们说我需要采取以下行动: 在项目结构中| 在“项目”对话框中,在界面中将“项目语言级别”更改为6.0-@Override。 但是,目前项目语言级别是6.0,但是我仍然看到错误。 维克(Vic),这是一个窗口,并且在语言级(Language level)下没有JVM版本(不幸的是,由于我有10个信誉,所以我无法发布图像) 问题答案: 如果您的项目有多个模

  • 问题内容: 在Java 8中,我可以轻松地编写: 我将获得在类中也可以使用的完整同步语义。但是,我不能在方法声明上使用修饰符: 现在,可以争论说这两个接口的行为方式相同,只是在on 和on上建立了一个 契约 ,这比 契约 要强一点。当然,我们也可能会争辩说,实现不应对具体的实现状态做出任何假设,或者这样的关键字根本无法发挥作用。 题: JSR-335专家组决定不支持接口方法的原因是什么? 问题答案

  • 我正在尝试实现这样一个方法,它接受一个关键参数,该参数要么是要么是可索引类型接口的实例。实现如下所示: Typescript给出块的以下错误: [ts]“IValidationContextIndex”仅引用类型,但在此处用作值。 有什么办法解决这个问题吗? 对于大多数接口,我认为可以添加属性(;),但这在本例中不起作用,因为该接口是可索引类型的接口....