我是一名Java开发人员,我想知道如何在Java程序中使用Scala?
答案 0 :(得分:40)
阅读有关Scala的Daniel Spiewak's excellent blog series。使用Scala,您可以保留:
但您可以编写Scala代码:
答案 1 :(得分:17)
另外,请查看Scala网站上最近的新闻帖子: “Research: Programming Style and Productivity”。
在他的论文中,Gilles Dubochet描述了他如何使用眼动追踪调查编程风格的两个方面。他发现使用for-comprehension和map的算法平均快30%,就像在Scala中那样,而不是那些带有Java迭代while循环的算法。
新闻项目的另一个重要引用:
在Scala为电力贸易公司撰写关键任务项目的Alex McGuire对Scala说:“简洁意味着我可以在一个屏幕上看到更多的程序。你可以获得更好的概述。当我有一些数学模型时用Java编写我必须保留两个模型,数学模型本身,第二个是如何用Java实现它的模型。使用Scala一个模型,数学模型,将会更有效。“
您可以阅读帖子的其余部分和其他关联项there。
答案 2 :(得分:11)
我可以用有限的经验用非常简单的语言命名一些非常明确的观点:
属性。 C ++和Java有一个公共getter / setter函数“property”的概念,它包含了一个内部类变量,导致了大量的样板代码。 C#将其形式化为一种真正的语言特性,并通过自动实现的属性减少了C#3.0中的大部分样板。 Scala类将简单属性定义为常规只读val或读/写变量。该类可能稍后选择使用get或get / set方法替换它们而不影响客户端代码。为此,Scala提供了最优雅的解决方案,具有最少的语言功能和复杂性。
数组使用常规泛型。在Java / C#中,泛型作为一种思想被拴在一起,并且是完全独立的,但是与数组有重叠的行为。
Scala具有不可变的“val”作为一流的语言功能。实际上,val类似于Java最终变量:顶部引用是不可变的,但内容可能会发生变异。
Scala允许块,for-yield循环和大括号中的代码返回一个值。在许多情况下,这是非常优雅的。一个非常小的优点是,这消除了对单独的三元运算符的需求。
Scala具有单例对象而不是C ++ / Java / C#类静态。这是一个更清洁的解决方案。
模式匹配。对象拆包。在很多情况下非常好。
原生元组。
持久不可变集合是默认集合并内置于标准库中。
答案 3 :(得分:6)
我不确定您是否可以在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所述,可能存在相反的情况。
答案 4 :(得分:4)
Scala或Java:
<强>优点:强>
<强>缺点:强>