我是一名Java开发者,想知道如何在我的Java程序中使用Scala?
阅读 Daniel Spiewak 的优秀博客系列 ,了解有关Scala的信息。 使用Scala,您可以保留:
但是,您可以编写更加简洁明了的Scala代码:
同时,看一下Scala网站上的最新新闻:研究:编程风格与生产力。
在他的论文中,Gilles Dubochet使用眼动追踪技术研究了编程风格的两个方面。他发现使用for循环和映射(如Scala)的算法比使用Java的迭代while循环理解快平均30%。
另外,新闻中的另一个关键引用:
Alex McGuire为电力交易公司使用Scala编写关键项目,他说Scala:“简洁意味着我可以在一个屏幕上看到程序的更多内容。你可以得到更好的概述。当我使用Java编写某些数学模型时,我必须将两个模型放在脑海中,即数学模型本身和如何在Java中实现它的模型。但用Scala只需要一个模型,即数学模型。更加高效。”
您可以在这里阅读其余部分和其他相关链接。
2019年更新
从我的有限经验中,我能以简单易懂的语言列出一些要点:
属性。C++和Java采用了公共getter/setter函数“属性”的概念,这导致了大量的样板代码。C#通过自动实现属性来正式将其作为一个真正的语言特性,并在C# 3.0中减少了大量的样板代码。Scala类将简单的属性定义为常规的只读val或读写var。该类稍后可以选择将其替换为get或get/set方法,而不影响客户端代码。对于此问题,Scala提供了最简洁的解决方案,具有最少的语言特性和复杂性。
数组使用常规泛型。在Java/C#中,int[]
与List<int>
或List<Int>
相比是多余的且令人困惑的。更糟糕的是,在Java中,List<Int>
具有很多运行时开销,因此许多开发人员必须知道使用int[]
。Scala避免了这个问题。此外,在Java/C#中,阵列支持(协变)强制类型转换,这是一个错误,他们现在不能修复这个错误是因为遗留问题。
Scala对不可变性的支持更好。 val
是一项基本语言特性。
Scala允许if块,for-yield循环和花括号中的代码返回值,在许多情况下非常优雅。一个非常小的增加是这消除了需要单独的三元运算符。
Scala具有单例对象,而不是C++/Java/C#的类静态。这是一个更清晰的解决方案。
模式匹配。对象解包。在许多情况下非常好用。
本机元组。
“案例类”,它们是大多数其他语言将称为记录类型或命名元组的东西。
更精致的标准库集合。
多行字符串。字符串插值格式化。
可选的分号。
缺点:
Java 已经有了很大的发展。Java 8 在 2014 年首次发布,但是要过几年才能逐步淘汰旧版 Java,并且全面应用新的 Java 8 特性到 Java 生态系统中。现在,Java 生态系统已经相当普遍地使用了 lambda、闭包和基本功能集合,支持筛选/映射/折叠等操作。最近,Java 还在发布版本预览模式下增加了基本的 var 本地变量类型推断以及多行字符串和 switch 表达式。
Scala 非常复杂。我认为像 implicits 这样的特性非常容易引起困惑。
Scala 具有最小的向后兼容性。Scala 2.10 的构件与 Scala 2.11 不兼容。
为其他 JVM 语言开发者(如 Scala、Clojure 或 Kotlin)构建 Java API 是很正常、得到良好支持并被接受的。通常不希望构建面向非 Scala 开发者的 Scala API。
我不确定你是否可以轻松地在Java程序中使用Scala,例如“从Java类调用Scala类”。
你可以尝试按照文章“混合Java和Scala”中的相关摘录操作。
相关摘录如下:
Scala或Java:
优点:
缺点: