Java具有闭包后的Scala优势[关闭]

Posted

技术标签:

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

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

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

【问题讨论】:

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

【讨论】:

以上是关于Java具有闭包后的Scala优势[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

scala 闭包的概念

Scala 中闭包的内存管理是如何工作的?

Scala 和 Groovy 之间的主要区别是啥? [关闭]

scala console怎么关闭

Rust 闭包和 Haskell lambda 有啥区别? [关闭]

函数式编程语言中的 CMS [关闭]