Scala的好处是什么?

时间:2009-08-28 08:32:28

标签: java scala

我是一名Java开发人员,我想知道如何在Java程序中使用Scala?

5 个答案:

答案 0 :(得分:40)

阅读有关Scala的Daniel Spiewak's excellent blog series。使用Scala,您可以保留:

  • 所有Java库
  • 在JVM上运行的所有优点(无处不在,管理工具,分析,垃圾收集等)

但您可以编写Scala代码:

  • 比Java更简洁明了(特别是使用更多功能样式,例如在集合库中)
  • 它有闭包和函数作为语言的一部分
  • 它有运营商重载(从使用角度来看)
  • 它有mixins(即包含实现的接口)

答案 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)

我可以用有限的经验用非常简单的语言命名一些非常明确的观点:

  1. 属性。 C ++和Java有一个公共getter / setter函数“property”的概念,它包含了一个内部类变量,导致了大量的样板代码。 C#将其形式化为一种真正的语言特性,并通过自动实现的属性减少了C#3.0中的大部分样板。 Scala类将简单属性定义为常规只读val或读/写变量。该类可能稍后选择使用get或get / set方法替换它们而不影响客户端代码。为此,Scala提供了最优雅的解决方案,具有最少的语言功能和复杂性。

  2. 数组使用常规泛型。在Java / C#中,泛型作为一种思想被拴在一起,并且是完全独立的,但是与数组有重叠的行为。

  3. Scala具有不可变的“val”作为一流的语言功能。实际上,val类似于Java最终变量:顶部引用是不可变的,但内容可能会发生变异。

  4. Scala允许块,for-yield循环和大括号中的代码返回一个值。在许多情况下,这是非常优雅的。一个非常小的优点是,这消除了对单独的三元运算符的需求。

  5. Scala具有单例对象而不是C ++ / Java / C#类静态。这是一个更清洁的解决方案。

  6. 模式匹配。对象拆包。在很多情况下非常好。

  7. 原生元组。

  8. 持久不可变集合是默认集合并内置于标准库中。

答案 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 RefugeesDaniel Spiewak所述,可能存在相反的情况。

答案 4 :(得分:4)

Scala或Java:

<强>优点:

  • Scala支持功能和命令式OO编程风格,并且它主张两个模型彼此不冲突,但它们是正交的并且可以相互补充。 Scala不要求或强制程序员使用特定的样式,但通常标准是在适当的时候使用具有不可变变量的函数样式(使用函数方法有一些好处,例如简洁和短的语法和使用纯函数通常会减少代码中的非确定性和副作用的数量),同时在代码看起来更简单或更容易理解的时候使用命令式编程。
  • Scala并不需要;在每一行的末尾都有可选的,这导致更清晰的代码
  • 在Scala中,函数是一流的cititzens
  • Scala支持一些直接用语言构建的高级功能,例如:Currying,Closures,高阶函数,模式匹配,高阶类型,Monads,隐式参数。
  • Scala可以与Java很好地交互,两者都可以共存。可以在Scala代码中直接使用Java库,从scala代码调用Java类。
  • 使用可在多种情况下使生活更轻松的语言构建元组
  • 支持运营商重载
  • 拥有丰富的生态系统,Apache中一些流行的开源项目就是基于它。
  • 使用Scala Futures
  • 可以很容易地编写异步和非阻塞代码
  • Scala支持使用Akka的Actor模型,当在多线程和并行业务用例中运行分布式应用程序时,它可以高效且可扩展(强制封装而不诉诸锁定,actor状态是本地的而不是共享的,更改和数据通过消息传播
  • 与Java相比,代码往往更短(可能并非总是如此)

<强>缺点:

  • 与Java和其他语言相比,陡峭的学习曲线一般需要学习者更多的时间来清楚地理解所有概念。有很多功能
  • 由于它是后来发明的,所以它在市场上并不像Java那么完善,因此整体而言Java更成熟,更具战斗性。
  • Scala打开了太多门。它允许许多复杂的语法,如果以不负责任的方式使用,可能会导致难以理解的代码。 滥用运算符重载,隐式参数和其他结构等内容可能会适得其反,可能会破坏代码的易读性。
  • Java也在不断发展,并且对于更新的版本(例如使用JDK 9模块)仍然会变得更好