Scala有哪些好处?

35

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

5个回答

39

阅读 Daniel Spiewak 的优秀博客系列 ,了解有关Scala的信息。 使用Scala,您可以保留:

  • 所有Java库
  • JVM的所有优势(普及度、管理工具、分析、垃圾回收等)

但是,您可以编写更加简洁明了的Scala代码:

  • 使用函数式风格编写代码(尤其是在集合库中),代码更加简洁清晰
  • 它具有闭包和函数作为语言的一部分
  • 它可以实现操作符重载(从使用者的角度看)
  • 它拥有mixin(即包含实现的接口)

17

同时,看一下Scala网站上的最新新闻:研究:编程风格与生产力

在他的论文中,Gilles Dubochet使用眼动追踪技术研究了编程风格的两个方面。他发现使用for循环和映射(如Scala)的算法比使用Java的迭代while循环理解快平均30%。

另外,新闻中的另一个关键引用:

Alex McGuire为电力交易公司使用Scala编写关键项目,他说Scala:“简洁意味着我可以在一个屏幕上看到程序的更多内容。你可以得到更好的概述。当我使用Java编写某些数学模型时,我必须将两个模型放在脑海中,即数学模型本身和如何在Java中实现它的模型。但用Scala只需要一个模型,即数学模型。更加高效。”

您可以在这里阅读其余部分和其他相关链接。


论文链接已经失效,通过谷歌搜索我找到了这个链接:http://infoscience.epfl.ch/record/138586/files/dubochet2009coco - pedrofurla

13

2019年更新

从我的有限经验中,我能以简单易懂的语言列出一些要点:

  1. 属性。C++和Java采用了公共getter/setter函数“属性”的概念,这导致了大量的样板代码。C#通过自动实现属性来正式将其作为一个真正的语言特性,并在C# 3.0中减少了大量的样板代码。Scala类将简单的属性定义为常规的只读val或读写var。该类稍后可以选择将其替换为get或get/set方法,而不影响客户端代码。对于此问题,Scala提供了最简洁的解决方案,具有最少的语言特性和复杂性。

  2. 数组使用常规泛型。在Java/C#中,int[]List<int>List<Int>相比是多余的且令人困惑的。更糟糕的是,在Java中,List<Int>具有很多运行时开销,因此许多开发人员必须知道使用int[]。Scala避免了这个问题。此外,在Java/C#中,阵列支持(协变)强制类型转换,这是一个错误,他们现在不能修复这个错误是因为遗留问题。

  3. Scala对不可变性的支持更好。 val是一项基本语言特性。

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

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

  6. 模式匹配。对象解包。在许多情况下非常好用。

  7. 本机元组。

  8. “案例类”,它们是大多数其他语言将称为记录类型或命名元组的东西。

  9. 更精致的标准库集合。

  10. 多行字符串。字符串插值格式化。

  11. 可选的分号。

缺点:

  1. Java 已经有了很大的发展。Java 8 在 2014 年首次发布,但是要过几年才能逐步淘汰旧版 Java,并且全面应用新的 Java 8 特性到 Java 生态系统中。现在,Java 生态系统已经相当普遍地使用了 lambda、闭包和基本功能集合,支持筛选/映射/折叠等操作。最近,Java 还在发布版本预览模式下增加了基本的 var 本地变量类型推断以及多行字符串和 switch 表达式。

  2. Scala 非常复杂。我认为像 implicits 这样的特性非常容易引起困惑。

  3. Scala 具有最小的向后兼容性。Scala 2.10 的构件与 Scala 2.11 不兼容。

  4. 为其他 JVM 语言开发者(如 Scala、Clojure 或 Kotlin)构建 Java API 是很正常、得到良好支持并被接受的。通常不希望构建面向非 Scala 开发者的 Scala API。


6

我不确定你是否可以轻松地在Java程序中使用Scala,例如“从Java类调用Scala类”。

你可以尝试按照文章“混合Java和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类实例一样。
当然,相反的情况也是可能的,正如Scala for Java难民的综述所描述的那样,该综述由Daniel Spiewak撰写。

4

Scala或Java:

优点:

  • Scala支持函数式和命令式面向对象编程风格,并提倡两种模型不冲突但却互补的观点。Scala不需要或强制程序员使用特定的风格,但通常标准是在适当时使用具有不变变量的函数式风格(使用纯函数通常可以减少代码中的非确定性和副作用),而在代码看起来更简单或更易懂时则采用命令式编程。
  • Scala不要求在每行末尾使用;,这使得代码更加清晰
  • 在Scala中,函数是一等公民
  • Scala支持一些直接构建在语言中的高级功能,如:柯里化、闭包、高阶函数、模式匹配、高阶类型、单子、隐式参数。
  • Scala可以很好地与Java交互,两者可以共存。可以在Scala代码中直接使用Java库调用Java类。
  • 在语言中内置了元组,这在多种情况下都会使生活更轻松
  • 支持运算符重载
  • 拥有丰富的生态系统,一些流行的Apache开源项目就是基于它构建的。
  • 使用Scala Futures非常容易编写异步和非阻塞代码
  • Scala使用Akka支持Actor模型,在多线程和并行业务用例中运行分布式应用程序时可以高效扩展(强制封装而不需要使用锁,Actor的状态是本地且不共享,更改和数据通过消息传播)
  • 与Java相比,代码往往更短(可能并非总是如此)

缺点:

  • 与Java和其他语言相比,学习曲线陡峭,通常需要更长时间来清楚地理解所有概念。具有许多特性
  • 由于Scala是后来发明的,因此在市场上并不像Java那样成熟和经过实践考验。
  • Scala打开了太多的门。它允许许多复杂的语法,如果不负责任地使用,可能会导致难以理解的代码。滥用诸如运算符重载、隐式参数和其他构造可能是适得其反的,可能会破坏代码的可读性。
  • Java也在不断发展,并随着新版本(例如JDK 9模块)变得更加完善。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接