Scala有什么好处?

时间:2009-04-07 18:41:27

标签: programming-languages scala language-features

是什么让Scala成为一种优秀的语言,其他而不是类型系统?几乎我读到的有关该语言的所有内容都将“强类型”作为使用Scala的一个重要原因,但必须有更多。什么是其他令人信服的和/或酷的语言功能,使Scala成为一个非常有用的工具?

14 个答案:

答案 0 :(得分:33)

以下是一些让我更喜欢Scala的东西(比如通常的Java):

a)类型推断。 Java的做法:

Map<Something, List<SomethingElse>> list = new HashMap<Something, List<SomethingElse>>()
与Scala相比,

..相当冗长。如果您给出其中一个列表,编译器应该能够弄明白。

b)一阶函数。同样,这个功能可以用类模拟,但它很难看。

c)包含mapfold的集合。这两个与(b)相关,而且每次我必须编写Java时,这两个都是我希望的。

d)模式匹配和案例类。

e)差异,这意味着如果S extends T,则List[S] extends List[T]也是如此。

还有一些静态类型的优点,我很快就被语言出售了。

答案 1 :(得分:24)

这是来自一堆语言中最好的部分的混搭,什么是不爱的:

  • Ruby的简洁语法
  • Java的表现
  • Erlang的演员支持
  • 瓶盖/块
  • 地图的便捷简写&amp;阵列

答案 2 :(得分:22)

斯卡拉经常因为有封闭和暗示而游行。这并不奇怪,因为缺少闭包和显式输入可能是Java样板的两个最大来源!

但是一旦你对它进行了更深入的研究,它就远远超出了Java而没有烦人的一点。也许Scala的最大优势不是一个特定的命名功能,但它在统一所提到的所有功能方面是多么成功在其他答案中。

职能部门

面向对象和函数式编程的结合:例如:因为函数是对象,Scala能够使Maps实现Function接口,所以当你使用map来查找一个值时,它在语法上与使用函数没有什么不同计算一个值。在很好地统一这些范例时,Scala确实是一种后功能语言。

或者运算符重载,这是通过实际上没有运算符实现的,它们只是在中缀表示法中使用的方法。所以1 + 2只是在整数上调用+方法。如果该方法的名称为plus,则您将其用作1 plus 2,这与1.plus(2)没有区别。由于另外的特征组合,这是可能的; Scala中的所有东西都是一个对象,没有原语,所以整数可以有方法。

其他功能融合

还提到了类型类,它是通过高级类型,单例对象和隐含的组合实现的。

其他兼容的功能是案例类和模式匹配,允许您轻松构建和解构代数数据类型,而无需手动编写Java所需的所有繁琐的相等,哈希码,构造函数和getter / setter逻辑。 / p>

默认情况下指定不变性,提供延迟值以及提供第一类函数都可以为您提供非常适合构建高效功能数据结构的语言。

这个列表还在继续,但我已经使用Scala超过3年了,而且我几乎每天都对一切都能很好地协同工作感到惊讶。

高效和多才多艺

Scala也是一种小语言,其规格(令人惊讶的是!)只需要大约是Java的1/3。这部分是因为Java在规范中有许多特殊情况,Scala简化了,部分原因是删除了原语和运算符等功能,部分原因是很多功能已从语言转移到库中。

作为这样做的好处,Scala库作者可用的所有技术也可供任何Scala用户使用,这使其成为定义自己的控制流构造和构建DSL的理想语言。这已被用于像Akka这样的项目 - 第三方Actor框架。

最后,它扩展了所有编程风格。

运行时解释器(称为REPL)允许您在交互式会话中快速探索想法,Scala文件也可以作为脚本运行,而无需显式编译。与类型推断结合使用时,这为Scala提供了动态语言的感觉,例如Ruby,Perl或bash脚本。

另一方面,特征,类,对象和自我类型允许您基于不同的组件构建一个完整的企业系统,并使用依赖注入而无需第三方工具。 Scala还与几乎与本机Java相当的Java库集成,通过在JVM上运行,可以利用该平台上提供的所有速度优势,以及在tomcat等容器中完全可用,或者与OSGi的。

答案 3 :(得分:15)

我是Scala的新手,但我的印象是:

真正好的JVM集成将是驱动因素。 JRuby可以调用java和java可以调用JRuby代码,但它显式调用另一种语言,而不是Scala-Java的干净集成。因此,您可以使用Java库,甚至可以在同一个项目中混合使用。

当我意识到驱动下一个优秀语言的东西很容易并发时,我开始关注scala。从性能角度来看,JVM具有良好的并发性。我确信有人会说Erlang更好,但Scala实际上可以被普通程序员使用。

Java倒塌的地方就是它如此痛苦地冗长。创建和传递Functor需要太多的字符。 Scala允许将函数作为参数传递。

在Java中无法创建联合类型或将接口应用于现有类。这些在Scala中都很容易。

静态类型通常会对冗长进行大的惩罚。 Scala消除了这种缺点,同时仍然提供静态类型的优势,即编译时类型检查,它使编辑器中的代码辅助更容易。

扩展语言的能力。这已经让Lisp持续了几十年,并且允许Ruby on Rails。

答案 4 :(得分:10)

类型系统确实是Scala最显着的特征。它比Java更具有语法上的便利性。

但对我而言,Scala最引人注目的功能是:

实际上,这些功能可让您近似(并在某些方面超越)Haskell的type classes。结合起来,它们可以让您编写特别模块化的代码。

答案 5 :(得分:6)

短暂:

  • 您获得了Java库的强大功能和平台独立性,但没有样板和冗长。
  • 您可以获得Ruby的简单性和生产力,但使用静态类型和编译的字节码。
  • 您获得了Haskell的功能优势和并发支持,但没有完全的范式转换和面向对象的好处。

我发现它的所有特征都具有特别吸引力,其中包括:

  • 大多数需要在Java中加载样板代码的面向对象设计模式都是本机支持的,例如:单例(通过对象),适配器,装饰器(通过特征和隐含),访问者(通过模式匹配),策略(通过闭包)等。
  • 您可以非常简洁地定义域模型和DSL,然后您可以使用必要的功能(通知,关联处理;解析,序列化)扩展它们,而无需代码生成或框架。
  • 最后,与支持良好的Java平台完全互操作。您可以在两个方向上混合使用Java和Scala。在经历了使代码难以维护的Java烦恼后切换到Scala时没有太多的惩罚和兼容性问题。

答案 6 :(得分:5)

答案 7 :(得分:4)

据说,在多个处理器上运行Scala代码非常容易{/ 3}}。

答案 8 :(得分:4)

控制流的表现力。例如,拥有一组需要以某种方式处理的数据是很常见的。这可能是一个交易清单,其中处理涉及按某些属性(投资工具的货币)进行分组,然后进行求和(以获得每种货币的总数)。

在Java中,这涉及分离出一段代码来进行分组(几行for循环),然后另一段代码进行求和(另一行代表循环)。在Scala中,这种类型的东西通常可以在一行代码中使用函数式编程然后折叠来实现,它可以非常有效地读取l-to-r。

当然,这只是一种基于Java的函数式语言的论证。

答案 9 :(得分:4)

已经提到过Scala的强大功能。但是,通过所有功能可以实现的一件事就是如何将所有功能整合在一起。

Scala成为最强大的语言之一,没有感觉匆忙中的功能。这种语言也不是证明某一点的学术活动。创新和真正先进的理念以不可思议的实用性和优雅的方式融入到语言中。

简而言之:Martin Odersky是一位纯粹的设计天才。这就是Scala的优点!

答案 10 :(得分:3)

我想添加多范式(OO和FP)自然赋予Scala优于其他语言的优势

答案 11 :(得分:3)

每天你编写Java代码都会变得越来越悲惨,每天你编写Scala代码就会变得更快乐。

答案 12 :(得分:1)

以下是对函数式语言的吸引力的一些相当深入的解释。

How/why do functional languages (specifically Erlang) scale well?

答案 13 :(得分:1)

如果我们放弃功能讨论并谈论风格,我会说它是流水线式的编码。您从某个对象或集合开始,键入点和属性或点和转换,然后执行它直到您形成所需的结果。通过这种方式,您可以轻松编写一系列易于阅读的变换形式。某些方面的特征也允许您应用相同的方法来构建类型。