草庐IT

java - Scala 闭包和 Java 8 闭包之间的兼容性

coder 2023-05-17 原文

在阅读了一些 OpenJDK 邮件列表条目后,似乎 Oracle 开发人员目前正在进一步从闭包提案中删除一些内容,因为 Java 语言中早期的设计错误使 Java 闭包的引入变得复杂。

考虑到 Scala 闭包比为 Java 8 计划的闭包强大得多,我想知道是否可以 e. G。调用一个从 Scala 获取闭包的 Java 方法,在 Java 中定义一个闭包并将其提供给 Scala 函数等?

那么 Java 闭包会像 Scala 对应的字节码一样表示还是以不同的方式表示? 是否有可能缩小 Java/Scala 闭包之间的功能差距?

最佳答案

我认为这比假设这里有两组利益相关者要复杂得多。 Project Lambda人们似乎大多独立于 Oracle 人员工作,occasionally throwing something over the wall Project Lambda 的人间接地发现了这一点。 (Scala,当然是第三个利益相关者。)

自从latest Project Lambda proposal是一起消除函数类型,并为实现具有单个抽象方法(SAM类型)的接口(interface)创建某种花哨的推理,我预见到以下内容:

  • 调用需要 Scala 闭包的 Scala 代码将完全取决于 Function* 特征的实现(以及一般特征的实现)——它是否出现在 Java 编译器中作为 SAM(它在 Scala 领域),或者非抽象方法对 JVM 是否也显得抽象。 (我认为它们目前看起来确实是抽象的,因为特征是作为接口(interface)实现的,但我对 Scala 的实现几乎一无所知。这可能是互操作性的一大障碍。)

    Java泛型的复杂性(特别是如何表达Int/int/Integer,或Unit/Nothing/void in a generic interface)也可能使事情复杂化。

  • 使用 Scala 函数来实现 Java SAM 与现在没有什么不同——您需要为您希望实现的特定接口(interface)创建一个 implicit 转换。

如果 JVM 获得函数类型(而 Oracle 似乎没有消除这种可能性),它可能取决于它是如何实现的。如果它们是实现特定接口(interface)的第一类对象,那么为了兼容,Scala 需要做的就是让 Function* 实现新接口(interface)。如果一种新的类型完全在 JVM 中实现,那么这可能会很困难——Scala 开发人员可能会像现在对 Array 那样使用魔法来包装它们,或者他们可能会创建创建 隐式转换。 (一个新的语言概念似乎有点牵强。)

我希望所有这些讨论的结果之一是所有各种 JVM 语言都将就表示闭包的一些标准方式达成一致——以便 Scala、Groovy、JRuby 等... 都可以以最少的麻烦来回传递闭包。

我更感兴趣的是 virtual extension methods 的提案。这将允许 Java Collections API 使用 lambdas。根据它们的实现方式,它们可能会极大地简化我们在更改 Scala 代码时必须处理的一些二进制兼容性问题,并且它们可能有助于更轻松、更有效地实现特征。

我希望一些 Scala 开发人员参与进来并提供他们的意见,但我实际上并没有在 Project Lambda 列表中看到任何关于 Scala 的讨论,也没有任何参与者以 Scala 开发人员身份跳出来告诉我。

关于java - Scala 闭包和 Java 8 闭包之间的兼容性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3046408/

有关java - Scala 闭包和 Java 8 闭包之间的兼容性的更多相关文章

  1. ruby-on-rails - Rails 应用程序之间的通信 - 2

    我构建了两个需要相互通信和发送文件的Rails应用程序。例如,一个Rails应用程序会发送请求以查看其他应用程序数据库中的表。然后另一个应用程序将呈现该表的json并将其发回。我还希望一个应用程序将存储在其公共(public)目录中的文本文件发送到另一个应用程序的公共(public)目录。我从来没有做过这样的事情,所以我什至不知道从哪里开始。任何帮助,将不胜感激。谢谢! 最佳答案 无论Rails是什么,几乎所有Web应用程序都有您的要求,大多数现代Web应用程序都需要相互通信。但是有一个小小的理解需要你坚持下去,网站不应直接访问彼此

  2. java - 等价于 Java 中的 Ruby Hash - 2

    我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/

  3. ruby - #之间? Cooper 的 *Beginning Ruby* 中的错误或异常 - 2

    在Cooper的书BeginningRuby中,第166页有一个我无法重现的示例。classSongincludeComparableattr_accessor:lengthdef(other)@lengthother.lengthenddefinitialize(song_name,length)@song_name=song_name@length=lengthendenda=Song.new('Rockaroundtheclock',143)b=Song.new('BohemianRhapsody',544)c=Song.new('MinuteWaltz',60)a.betwee

  4. ruby-on-rails - `a ||= b` 和 `a = b if a.nil 之间的区别? - 2

    我正在检查一个Rails项目。在ERubyHTML模板页面上,我看到了这样几行:我不明白为什么不这样写:在这种情况下,||=和ifnil?有什么区别? 最佳答案 在这种特殊情况下没有区别,但可能是出于习惯。每当我看到nil?被使用时,它几乎总是使用不当。在Ruby中,很少有东西在逻辑上是假的,只有文字false和nil是。这意味着像if(!x.nil?)这样的代码几乎总是更好地表示为if(x)除非期望x可能是文字false。我会将其切换为||=false,因为它具有相同的结果,但这在很大程度上取决于偏好。唯一的缺点是赋值会在每次运行

  5. java - 从 JRuby 调用 Java 类的问题 - 2

    我正在尝试使用boilerpipe来自JRuby。我看过guide从JRuby调用Java,并成功地将它与另一个Java包一起使用,但无法弄清楚为什么同样的东西不能用于boilerpipe。我正在尝试基本上从JRuby中执行与此Java等效的操作:URLurl=newURL("http://www.example.com/some-location/index.html");Stringtext=ArticleExtractor.INSTANCE.getText(url);在JRuby中试过这个:require'java'url=java.net.URL.new("http://www

  6. ruby - 分布式事务和队列,ruby,erlang,scala - 2

    我有一个涉及多台机器、消息队列和事务的问题。因此,例如用户点击网页,点击将消息发送到另一台机器,该机器将付款添加到用户的帐户。每秒可能有数千次点击。事务的所有方面都应该是容错的。我以前从未遇到过这样的事情,但一些阅读表明这是一个众所周知的问题。所以我的问题。我假设安全的方法是使用两阶段提交,但协议(protocol)是阻塞的,所以我不会获得所需的性能,我是否正确?我通常写Ruby,但似乎Redis之类的数据库和Rescue、RabbitMQ等消息队列系统对我的帮助不大——即使我实现某种两阶段提交,如果Redis崩溃,数据也会丢失,因为它本质上只是内存。所有这些让我开始关注erlang和

  7. java - 我的模型类或其他类中应该有逻辑吗 - 2

    我只想对我一直在思考的这个问题有其他意见,例如我有classuser_controller和classuserclassUserattr_accessor:name,:usernameendclassUserController//dosomethingaboutanythingaboutusersend问题是我的User类中是否应该有逻辑user=User.newuser.do_something(user1)oritshouldbeuser_controller=UserController.newuser_controller.do_something(user1,user2)我

  8. java - 什么相当于 ruby​​ 的 rack 或 python 的 Java wsgi? - 2

    什么是ruby​​的rack或python的Java的wsgi?还有一个路由库。 最佳答案 来自Python标准PEP333:Bycontrast,althoughJavahasjustasmanywebapplicationframeworksavailable,Java's"servlet"APImakesitpossibleforapplicationswrittenwithanyJavawebapplicationframeworktoruninanywebserverthatsupportstheservletAPI.ht

  9. 【鸿蒙应用开发系列】- 获取系统设备信息以及版本API兼容调用方式 - 2

    在应用开发中,有时候我们需要获取系统的设备信息,用于数据上报和行为分析。那在鸿蒙系统中,我们应该怎么去获取设备的系统信息呢,比如说获取手机的系统版本号、手机的制造商、手机型号等数据。1、获取方式这里分为两种情况,一种是设备信息的获取,一种是系统信息的获取。1.1、获取设备信息获取设备信息,鸿蒙的SDK包为我们提供了DeviceInfo类,通过该类的一些静态方法,可以获取设备信息,DeviceInfo类的包路径为:ohos.system.DeviceInfo.具体的方法如下:ModifierandTypeMethodDescriptionstatic StringgetAbiList​()Obt

  10. Observability:从零开始创建 Java 微服务并监控它 (二) - 2

    这篇文章是继上一篇文章“Observability:从零开始创建Java微服务并监控它(一)”的续篇。在上一篇文章中,我们讲述了如何创建一个Javaweb应用,并使用Filebeat来收集应用所生成的日志。在今天的文章中,我来详述如何收集应用的指标,使用APM来监控应用并监督web服务的在线情况。源码可以在地址 https://github.com/liu-xiao-guo/java_observability 进行下载。摄入指标指标被视为可以随时更改的时间点值。当前请求的数量可以改变任何毫秒。你可能有1000个请求的峰值,然后一切都回到一个请求。这也意味着这些指标可能不准确,你还想提取最小/

随机推荐