【问题标题】:Scala advantages after Java having closures [closed]Java具有闭包后的Scala优势[关闭]
【发布时间】:2011-04-20 04:10:07
【问题描述】:

随着闭包被添加到 Java 中,作为语言选择,Scala 相对于 Java 的优势是什么?

有人可以详细说明任何优点吗?

【问题讨论】:

  • 欢迎来到 Stack Overflow。找到问题后,请记住“接受”问题的正确答案。这有助于其他贡献者知道您的问题已得到解决,并奖励帮助您的人。
  • AFAIK,Oracle 已经定义 Java 7 不会有闭包。对于 Java 8,这已经推迟了几年。

标签: java scala closures


【解决方案1】:

除了闭包(Java 似乎没有那么接近),这里列出了 Java 中缺少的 Scala 特性。我将省略这里的库,而专注于语言本身的特性。无论如何,这并不全面,但我认为它包含了大件物品。

  • 隐式参数/转换
  • 模式匹配、案例类
  • 类型推断(一些)
  • Higher-kinded types(类型构造函数的抽象)
  • Monadic for 理解
  • 差异注释
  • 与行为(特征)的接口
  • 默认和命名参数
  • 统一的方法和运算符(方法可以用作中缀运算符,运算符可以重载,因为它们只是方法)
  • 统一的类型层次结构;没有原始类型
  • 属性而不是 getter 和 setter
  • 抽象值
  • 一流的不可变引用(vals 与 vars 一样容易声明)
  • 按名称(惰性)术语(也许 Java 闭包会使这变得相当容易表达)
  • 一些尾调用递归优化
  • 抽象类型
  • 类型别名
  • 自我类型
  • 路径相关类型
  • 结构类型
  • 类型ascription,区别于类型casting
  • 重命名导入
  • 一流的模块(对象)
  • 一流的包
  • 具体化的泛型 (manifests)
  • Delimited continuations

这些构建块支持的一些很酷的二级结构:

  • 类型类(通过隐式参数和更高种类的类型)
  • Pimp My Library" 模式(通过隐式转换)
  • 内部 DSL(通过运算符重载和中缀方法)
  • 解析器组合器(由高阶函数启用,并通过中缀方法变得漂亮)
  • 生成器、协程、自定义控制结构(通过定界延续)
  • 类型级编程(通过更高种类和抽象类型)
  • 依赖注入框架过时(通过Cake Pattern

最后,我要提一下 Scala 有一个 REPL(读取-评估-打印-循环)——这并不是语言本身的真正特性,但拥有它非常好!

【讨论】:

  • 很棒的列表,因为如果不尝试添加就看不到这样的东西,这里有一些需要考虑的补充:抽象值、抽象类型、鸭子类型、第一类模块(对象),依赖注入框架的过时(通过蛋糕模式)
  • 很好的补充,我知道我一定会忘记一些重要的!
  • 另一个:利用包的分层特性精确选择类的可见性的能力。我非常怀念 Java。
  • 解释一下“运算符重载”和“作为中缀运算符的方法”来自相同的设计选择可能很有用:运算符和方法是统一的。
  • 谢谢@barjak,我采纳了你的建议。
【解决方案2】:

即使 Java 7 [8,..] 有一天会拥有一流的功能,它仍然缺乏隐式、类型推断、强大的集合库、模式匹配、特征和许多其他提高生产力的东西。不谈论各种 Actor 库,构建 DSL 的丰富功能,...

【讨论】:

  • 我不同意 Collections 库部分,Scala 的 Collections 是在考虑 Scala 的情况下创建的,Java 和 Java 很自然,它们在很多方面都不同,但它们仍然都很出色,模式然而,匹配和特征是 Java 真正缺少的东西。
  • Java 的集合库是在没有考虑不可变数据结构的情况下实现的。这是任何语言的错误。
  • @pelotom:Java 根本没有固有的不可变数据结构,所以我认为 Java 中真正不可变的集合不会在很长一段时间内出现。我冒昧地猜测一下,尽管您所指的不是一种语言的 de facto 事物,它更多的是某种程序员使用的功能,当然不是不好也不可忽视的事情。
  • @Esko:我不确定你的意思。在 Java 中定义“固有不可变的数据结构”是完全可能的,集合库只是忽略了。
  • @pelotom: final 在 Java 中与 const 不同,这意味着你可以用反射来打破它,你不能以编程方式声明你的类是(深度)不可变的,Java 本身没有t 支持用于快速复制对象的简单构造...不,不变性不是 Java 原生的特性,您可以通过巧妙的编程非常接近(参见 String 类作为示例)但是它仍然不是完全不可变的。
【解决方案3】:

我听说的最新消息是闭包不会进入 Java 7。

http://www.baptiste-wicht.com/2010/09/jdk-7-features-updated-plan-b-is-apparently-here/

http://openjdk.java.net/projects/jdk7/features/

第二个链接清楚地列出了推迟到 JDK 8 的项目 Lambda(闭包)。

【讨论】:

    猜你喜欢
    • 2015-04-17
    • 2016-05-14
    • 1970-01-01
    • 1970-01-01
    • 2015-05-04
    • 1970-01-01
    • 1970-01-01
    • 2014-02-27
    • 2010-12-18
    相关资源
    最近更新 更多