java 允许使用函数式接口作为方法吗?

2024-06-28

有了新的 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 http://mail.openjdk.java.net/pipermail/lambda-dev/2012-February/004518.html

它被拒绝的主要原因是解析器/编译器会出现与歧义相关的各种问题。或者用 Brian Goetz 的话说:

我认为,归根结底,这只是对函数接口而不是函数类型的承诺感到不舒服,并试图退回到一个软弱无力的中间立场。我不认为这提供了足够令人信服的好处。

如果你觉得这样“欲言又止”特性仍然会为 Java 语言增加价值,您可以在 lambda 邮件列表之一上再次碰碰运气,也许有令人信服的论据:-)

替代

这是可能的,但可能不像 JavaScript 中的示例语法所建议的那样优雅。据最新消息Brian Goetz 的 lambda 状态 http://cr.openjdk.java.net/~briangoetz/lambda/lambda-state-4.html,会有章节中提到的方法参考

8 方法参考

[...]

9种方法参考

[...]实际上存在三种不同类型的方法引用,每种 语法略有不同:

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

因此,事实上,您的示例必须按照以下方式重新表述:

interface Func { void execute(int i); }

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

您现在可以传递对该执行方法的引用:

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

换句话说,“函数式”样式将在调用方法的声明站点实现,而不是在使用站点实现。但与 JavaScript 一样,使用站点不必知道具体方法的名称Func。它只能接受一个Block对于返回的方法void, or a Callable对于返回值的方法。

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java 允许使用函数式接口作为方法吗? 的相关文章

随机推荐

  • Java安全框架

    在新项目中 安全性总是排在最后 或者您使用像 Spring 这样的框架 其中安全性已经内置并且可以轻松切换 我试图找到一个可以插入 Swing 和 Web 应用程序 以及 JavaFX 的开放安全框架 也许很容易理解 我研究了普通的 JAA
  • 多态查询的数据库压力

    我在 JPA 中使用了超过 5 个子类的多态抓取 执行的查询如下 explain SELECT ohlcrawbea0 trade time AS trade ti3 11 ohlcrawbea0 avg price AS avg pric
  • html5数据属性需要值吗? [复制]

    这个问题在这里已经有答案了 我想知道 html 数据属性是否真的需要应用一个值 我想知道这一点 因为通常我们想知道的是该属性是否实际上被设置为充当标志 当然我们可以为此使用一个类 但实际上 除非您打算以不同的方式设置这些项目的样式 否则标志
  • 为什么这个 CLLocationCooperative2D 变量不可分配?

    我有一个地理编码器方法 我希望它返回为我生成的 CLLocationCooperative2D CLLocationCoordinate2D geocode CLGeocoder geocoder CLGeocoder alloc init
  • 协作虚拟实例的 IP 范围?

    我想介绍一下我们公司的Google Colaboratory 然而 对于我们的大多数实验 我们需要访问使用白名单的 mongoDB 服务器 因此 我想知道 Colaboratory 使用的虚拟实例是否有我们可以使用的特定 IP 范围 否则
  • iPhone 到 Mac 开发

    我是一名 iPhone 开发人员 非常了解该框架 随着 Mac 应用商店即将推出 我想了解有关 Mac 开发的更多信息 有没有好的指南 教程 等等 帮助过渡 我环顾四周并没有发现太多 谢谢您的帮助 您基本上需要了解之间的区别UIKit an
  • Python shebang 线[重复]

    这个问题在这里已经有答案了 我见过有些人在 env 后面加上一个空格来写 shebang 行 例如 usr bin env python 这是拼写错误吗 我从来不使用空格 我用 usr bin env python 有人可以澄清一下吗 不
  • 对角画笔样式给我黑色区域

    我想用以下代码在画布上绘制一个对角线十字 InFlateRect r 1 1 Canvas Brush Color clYellow Canvas Brush Style bsFDiagonal Canvas Pen Color clRed
  • TypeScript TS7015:元素隐式具有“any”类型,因为索引表达式不是“number”类型

    我在 Angular 2 应用程序中收到此编译错误 TS7015 元素隐式具有 any 类型 因为索引表达式不是 number 类型 导致它的代码片段是 getApplicationCount state string return thi
  • 本地主机上的连接被拒绝

    我正在学校尝试使用我的 NodeJS 和 ReactJS 应用程序 但每次运行服务器时 都会出现错误localhost PORT net ERR CONNECTION REFUSED wifi 是否拒绝本地主机上的连接 PS 反应端渲染正确
  • “弱链接”框架是什么意思?

    在 Xcode 中 我可以将框架设置为 可选 而不是 必需 这意味着该框架是弱链接的 这是否意味着框架仅在导入到某个地方时才包含在捆绑包中 我想弱链接一些使用的调试框架私有API 并且我不希望它们出现在 App Store 版本中 重要的提
  • 为什么 C# 中的局部变量不能是 volatile?

    public void MyTest bool eventFinished false myEventRaiser OnEvent delegate doStuff eventFinished true myEventRaiser Rais
  • Python Tkinter 动画

    为什么动画不起作用 当我运行程序时 形状不会移动 from Tkinter import import time class alien object def init self self root Tk self canvas Canva
  • EmberJS:如何使用 ember-qunit 的 moduleFor 测试控制器操作,它使用 ember-data 存储

    我想测试这样的控制器操作 createNewBase function var attributesForNewBase this get model getProperties self this newBase this store c
  • 将 subprocess.run 与包含引号的参数一起使用

    我尝试运行的命令如下所示 xvfb run auto servernum server args screen 0 640x480x24 error file dev stdout opt myExecutable 这是我在 Python3
  • 我应该如何编写符合 ISO C++ 标准的自定义 new 和 delete 运算符?

    我应该如何编写符合ISO C 标准的自定义new and delete运营商 这是继续重载 new 和删除 https stackoverflow com questions 4421706 operator overloading 442
  • 在 Scala 中实现“.clone”

    我正在想办法 clone我自己的对象 在 Scala 中 这是为了模拟 因此可变状态是必须的 由此产生了克隆的全部需要 在提前模拟时间之前 我将克隆整个状态结构 这是我目前的尝试 abstract trait Cloneable A See
  • 如果没有 NULL 我们会做什么?

    我曾经读到过 拥有可空类型绝对是一种邪恶 我相信这是创造它们的人写的一篇文章 在艾达 我相信这是这篇文章 http qconlondon com london 2009 presentation Null References The Bi
  • 导出时的 Highcharts css 样式

    I have the following graph in digital See image but when using the Highchart s hamburguer CSS menu to export to PDF or J
  • java 允许使用函数式接口作为方法吗?

    有了新的 java lambda 和函数式接口的概念 是否可以将这些函数式接口视为方法 interface Func void execute int i void call Func f f 1 instead of f execute