Scala是一种有趣的语言。它一方面吸收继承了多种语言中的优秀特性,一方面又没有抛弃Java这个强大的平台,它运行在Java虚拟机(JavaVirtualMachine)之上,轻松实现和丰富的Java类库互联互通。它既支持面向对象的编程方式,又支持函数式编程。它写出的程序像动态语言一样简洁,但事实上它确是严格意义上的静态语言。Scala就像一位武林中的集大成者,将过去几十年计算机语言发展历史中的精萃集于一身,化繁为简,为程序员们提供了一种新的选择。
Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承、指针等概念,因此Java语言具有功能强大和简单易用两个特征。Java语言作为静态面向对象编程语言的代表,极好地实现了面向对象理论,允许程序员以优雅的思维方式进行复杂的编程。
scala采用三个双引号“”“支持换行字符串,Java需要采用“+”进行字符串的连接。
scala的return是可选的,方法调用会自动返回最后求值的表达式。如果scala使用了return则需要显示指定方法的返回值
Java需要显示的采用return进行值的返回。
scala默认是public,java默认是protected.
scala默认导入java.lang包、scala包、scala.Predef类。
java默认导入java.lang包
scala不支持接口interface,采用trait(类似于Java中的抽象类)。
java支持接口
scala语言机制上支持单例对象和伴生对象,伴生类。伴生类和伴生对象需要在一个类文件中使用,在使用伴生对象时,系统隐式地调用apply生成一个伴生实例的对象。
java由类成员,单例对象需要自己实现。
scala支持以函数作为参数,格式为deferror(msg:=》String)表示msg是输入参数,输出参数为String的函数。
java不支持。
相比较与Java,在下觉得Scala最主要的有以下两点优势:
FP泛型支持
如果用多了Spring中大量的template接口,你就会觉得FP其实还是蛮好用的。
而这仅仅是FP好处的冰山一角。
函数其实就是一个input-》output(scala也是这么表示一个函数的),没有任何副作用,与状态无关,由于这种特性,所以函数式的编程范式在分布式领域有很多好处
对于函数式编程,我的知识实在是皮毛,但可以这么说,FP相对与OO有哪些优势,Scala对于Java差不多就有哪些优势。
正因为FP有如此多的优势,所以Java8才引入了FP.从某种程度上来说,Java认可了Scala的做法。
类型系统支持
如果说Java是一种类型安全的语言,那么毫无疑问,Scala的类型更加安全,从某种程度上说,Scala的类型是图灵完备的,而Java不是。我的一位好朋友在这方面研究的比较深(http://hongjiang.info/scala/),而我对与Scala的类型系统的理解,也还是皮毛。
正是以上这两点大优势,造成了Scala比Java更加安全,同时又具备灵活性,想象力。
其他语言层面上的优势
在Java中,你是否有时很想继承多个AbstractClass呢?对不起,Java只支持单继承
在Scala中,你可以进行mixin(Java8也开始引入defaultmethod了呢)
在Java中,想要一个singleton?要么在staticblock中做,要么利用Enum的单例特性完成,或者其他更纠结的方法。
在Scala中,只要声明为object,即为单例。
在Java中,想要延迟加载一个单例?doublecheck吧
在Scala中,只要在object中将变量修饰为lazy即可
在Java中,想要对集合进行一些操作?使用一层一层的for循环吧
在Scala中,使用collection的一些集合操作,即可获得如写SQL般的享受。
在Java中,在并发中想对Future进行回调?对不起,Future不是Listenable(无法支持回调),除非你使用额外的工具(如guava,spring)
在Scala中,本来就主张异步编程,future和promise的配合让人非常愉快。
在Java中,要透明扩展一个第三方库的类怎么办?包装,再加一层。
在Scala中,有强大的implicit机制让你更优雅的做到这一点,同时还能保证类型安全(比起Ruby的monkeypatch,要安全得多)
Scala的表达力很强,相同功能的代码,用Java和Scala的行数不可同日而语。
这些单单是语言层面上的优势,除此之外,Scala还能无缝结合Java
尽管罗列了如此多的好处,但Scala有如下劣势:
语法复杂,学习曲线非常高
国内Scala程序员很难找(目前Scala的影响力也在缓慢扩大,比如Scala社区中的明星Spark的流行也在慢慢拉动Scala的流行,如同rails之于ruby)
社区,生态还比较小,Scala风格的库还非常少(但可以和Java很容易的斜街很多时候弥补了这一点)