【发布时间】:2009-08-28 08:32:28
【问题描述】:
我是一名 Java 开发人员,我想知道如何在我的 Java 程序中使用 Scala?
【问题讨论】:
我是一名 Java 开发人员,我想知道如何在我的 Java 程序中使用 Scala?
【问题讨论】:
去阅读Daniel Spiewak's excellent blog series 了解 Scala。使用 Scala,您可以保留:
但你可以编写 Scala 代码:
【讨论】:
另外,看看最近在 Scala 网站上发布的新闻: “Research: Programming Style and Productivity”。
在他的论文Gilles Dubochet 中,描述了他如何使用眼球运动跟踪研究编程风格的两个方面。他发现,理解使用 for-comprehensions 和映射的算法(如在 Scala 中)比使用 Java 的迭代 while 循环的算法平均要快 30%。
新闻中的另一个关键引述:
用 Scala 为电力贸易公司编写任务关键型项目的 Alex McGuire 谈到 Scala:“简洁意味着我可以在一个屏幕上看到更多程序。您可以获得更好的概览。当我有一些数学模型时要使用 Java 编写,我必须在脑海中保留两个模型,一个是数学模型本身,另一个是如何在 Java 中实现它的模型。使用 Scala 一个模型,数学模型就可以了。效率更高。”
您阅读了帖子的其余部分和其他链接项目there。
【讨论】:
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 生态系统中充分使用新的 Java 8 功能。现在,支持过滤器/映射/折叠的 lambdas 和闭包以及基本功能集合对于 Java 生态系统来说是相当标准的。最近,Java 增加了基本的var 局部变量类型推断,并在发布版本预览模式中具有多行字符串和开关表达式。
Scala 很复杂。我会强调像 implicits 这样的功能本质上是令人困惑的。
Scala 具有最小的向后兼容性。 Scala 2.10 工件与 Scala 2.11 不兼容。
为 Scala 或 Clojure 或 Kotlin 等其他 JVM 语言开发人员构建 Java API 是正常的,得到很好的支持和接受。您通常不希望在 Scala 中构建迎合非 Scala 开发人员的 API。
【讨论】:
我不确定您是否可以在 Java 程序中轻松使用 Scala,例如“从 Java 类调用 Scala 类”。
您可以按照文章“Mixing Java and Scala”进行尝试。
相关摘录:
问题在于 Java 和 Scala 的编译步骤是分开的:您不能一次编译 Java 和 Scala 文件。
如果您的 Java 文件都没有引用任何 Scala 类,您可以先编译所有 Java 类,然后再编译您的 Scala 类。
或者,如果您的 Scala 文件都没有引用任何 Java 类,您可以反过来做。
但是,如果您希望您的 Java 类可以访问您的 Scala 类,并且还希望 Scala 类可以访问您的 Java 类,那就有问题了。Scala 代码可以很容易地直接调用 Java 代码,但有时从 Java 代码调用 Scala 代码比较棘手,因为从 Scala 到字节码的转换不像 Java 那样简单:
有时,Scala 编译器会向符号添加字符或进行其他更改,这些更改必须在从 Java 调用时显式处理。
但是 Scala 类可以实现 Java 接口,并且可以将该类的实例传递给期望该接口实例的 Java 方法。
然后,Java 类调用该实例上的接口方法,就像它是 Java 类实例一样。
当然,相反的情况也是可能的,正如Roundup: Scala for Java Refugees 中所述,来自Daniel Spiewak。
【讨论】:
Scala 或 Java:
优点:
缺点:
【讨论】: