返回介绍

数学基础

统计学习

深度学习

工具

Scala

六、Scala2.12 和 Java 8 的集成

发布于 2023-07-17 23:38:22 字数 3420 浏览 0 评论 0 收藏 0

  1. Java8Java 语言和字节码做了一些改进,而 Scala 2.12 开始用到了这些改进。通过利用 Java8 的这些新特性,Scala2.12 的编译器可以生成更小的 class 文件和 jar 文件,同时改善了特质的二进制兼容性。

  2. Scala 程序员的角度看,Scala2.12 中与 Java8 相关的最显著的改进是:Scala 函数字面量现在可以像 Java8 中的 lambda 表达式那样当做匿名类的实例的精简形式来使用。

    Java8 之前,为了将某种 action 传入某个方法中,Java 通常都会定义匿名内部类的实例,如:

    
    
    xxxxxxxxxx
    JButton button = new JButton(); button.addActionListener( new ActionListener(){ public void actionPerformed(ActionEvent event){ System.out.println("pressed!"); } } )

    这里一个匿名的 ActionListener 的实例被创建出来,然后传递给 JButton.addActionListener 方法。

    Java8 中,任何需要某个只包含单个抽象方法(又称作 single abstract method:SAM )的类或接口的实例的地方,都可以使用 lambda 表达式。 ActionListener 就是这样一个接口,因为它只包含单个抽象方法 actionPerformed 。因此在 Java8 中上述代码可以调整为:

    
    
    xxxxxxxxxx
    JButton button = new JButton(); button.addActionListener( event -> System.out.println("pressed!") )

    而在 Scala 中,我们可以进一步使用函数字面量:

    
    
    xxxxxxxxxx
    val button = new JButton button.addActionListener( _ => println("pressed!"))
    • Scala 2.12 之前,为了写出上述代码,我们需要定义一个从 ActionEvent => Unit 函数类型到 ActionListener 类型的隐式转换,从而支持这种风格的代码。
    • Scala 2.12 及其以后,我们可以直接使用函数字面量,而不需要定义这个隐式类型转换。
  3. Scala 2.12 中,允许在任何要求某个 SAM 的类或者特质的实例的地方使用函数类型。

    注意:只有函数字面量可以被适配成 SAM 类型,而不能使用函数类型的表达式。如:

    
    
    xxxxxxxxxx
    val button = new JButton val f = (event : ActionEvent) => println("pressed!") // 函数类型的表达式 button.addActionListener(f) // 不支持
  4. Scala 的函数类型定义为包含具体方法的特质,而 Scala 2.12 会将特质编译为带有默认方法的 Java 接口(Java 8 的新特性)。因此,在 Java 看来,Scala 的函数类型跟 SAM 没什么两样。

    因此如果在 Java 代码中调用 Scala 方法,那么 Scala 方法中需要函数类型的地方,Java 都可以传入 lambda 表达式。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文