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

Java 8是否支持闭包?

温星华
2023-03-14
问题内容

我很困惑。我以为Java 8将会从石器时代诞生并开始支持lambda / closures。但是当我尝试这个:

public static void main(String[] args) {
    int number = 5;

    ObjectCallback callback = () -> {
        return (number = number + 1);
    };

    Object result = callback.Callback();
    System.out.println(result);
}

…说number should be effectively final。恩,我想不是闭包。听起来好像是通过值而不是通过引用复制环境。

奖金问题!

Android是否支持Java 8功能?


问题答案:

为什么,为什么,Java。为什么哦为什么。

您需要与相关的Oracle Java团队成员进行长时间的(私人)讨论,以获得真正的答案。(如果他们愿意与您交谈…)

但是我怀疑这是向后兼容性和项目资源限制的结合。从务实的角度来看,当前的方法“足够好”。

将过程上下文实现为第一类对象(即闭包)要求某些局部变量的生存期超出声明方法调用的返回范围。这意味着您不能仅仅将它们放在堆栈上。相反,您最终遇到了 一些
局部变量必须是堆对象的字段的情况。这意味着您需要一种新型的隐藏类或对JVM体系结构的根本更改。

尽管从技术上来说可以实现这种事情,但是Java语言不是“绿色领域”语言。要支持Java中的“真正的闭包”,改变性质将是困难的:

  • Oracle和第三方实施者将花费大量精力来更新所有工具链。(我们不仅在谈论编译器。还有调试器,事件探查器,混淆器,字节码工程框架,持久性框架…)

  • 然后就有可能其中一些更改会影响那里数百万个现有已部署Java应用程序的向后兼容性。

  • 对以某种方式利用JVM的 其他 语言等具有潜在的影响。例如,Android依靠JVM体系结构/字节码文件作为其Davlik工具链的“输入语言”。有用于Python,Ruby和各种功能语言的语言实现,这些html" target="_blank">功能代码是为JVM平台生成的。

简而言之,Java中的“真正的闭包”对于每个有关人员来说都是一个可怕的提议。“关闭决赛”是确实可行的实用折衷方案,在实践中已经足够了。

最后,final在将来的版本中总是有可能删除限制。(虽然我不会屏住呼吸…)

Android是否支持Java-8功能?

除非有人具有可靠的内部知识,否则这是无法回答的。如果他们这样做了,他们会很疯狂地在这里透露它。当然,Google尚未宣布支持Java 8。

但是好消息是,KitKat和相应版本的Android Studio或Eclipse ADT现在支持Java 7语法扩展。



 类似资料:
  • 闭包定义 我们可以使用闭包的方式定义一些特殊需求的路由,而不需要执行控制器的操作方法了,例如: Route::get('hello', function () { return 'hello,world!'; }); 参数传递 闭包定义的时候支持参数传递,例如: Route::get('hello/:name', function ($name) { return 'Hello,'

  • 问题内容: 因此,我希望将其转换为这样的Java代码: JAXB是否可能? 曾经看到一些WebService Client存根生成器正在执行此操作,但也许不确定axis2 Webservice。 问题答案: 的 JAXB(JSR-222) 规范没有盖产生快速失败逻辑到域模型。现在,一种常见的做法是以注释(或XML)的形式表示验证规则,并对它们进行验证。 Bean验证(JSR-303) 对此进行了标

  • 问题内容: 我正在尝试执行一个简单的INSERT并返回标识(自动递增主键)。我试过了 我收到以下错误 SQLite是否支持SCOPE_IDENTITY? 如果可以,该如何使用? 如果不是,我(最好是“线程安全”)的替代方案是什么? 问题答案: 查看常见问题解答。该sqlite3_last_insert_rowid()函数将做到这一点。不过要小心触发器。

  • 我正在使用RDF4J工作台: 尽管我可以在github上的RDF4J存储库中看到对GeoSPARQL的引用,但目前似乎还没有实现。我在已清除的“带RDFS自旋支持的内存存储”存储库上运行了这个SPARQL更新查询,以在RDF4J工作台上设置测试: 这导致一个存储库具有一个事实。 现在,我尝试通过以下查询查找与文字多边形的重叠,该查询应该可以找到上面设置的一个事实: 此查询以HTML的形式给出了一个

  • 问题内容: 我想知道是否有任何方法可以在Java中实现。我认为,如果没有本地对闭包的支持,这是不可能的。 问题答案: Java 8(2014年3月18日发布)不支持curring。可以将Missingfaktor在答案中发布的示例Java代码重写为: …这是非常好的。就个人而言,有了Java 8,我几乎没有理由使用替代的JVM语言(例如Scala或Clojure)。当然,它们提供了其他语言功能,但

  • Spring Cloud库伯内特斯是否支持Spring Cloud负载均衡器? 我要在库伯内特斯上部署Spring启动应用程序,并通过以下链接执行客户端负载平衡功能区客户端https://cloud.spring.io/spring-cloud-static/spring-cloud-kubernetes/2.0.0.M1/reference/html/#ribbon-discovery-in-k