如题,还是说两个侧重点不同?如果是,希望大神能指点一下。
相对于Java而言,Scala的代码更为精简(减低犯错),而且功能更为广泛(Scala其实是Scalable Language 的简称,意为可扩展的语言),许多Scala的特性和语法都是针对Java的不足和弱点来设计的。
Scala的特点是有很多函数程式语言的特性(例如ML,Miranda, Scheme,Haskell),譬如惰性求值,list comprehension, type inference, anonymous function, pattern matching 等等,同时也包含 Object-Oriented 的特性(OO 能与 FP 混合使用是 Scala 的亮点)。此外,许多相似于高级编程语言的语法也渗入其中(例如 Python),不仅提高了 Scala 代码的可读性,维护、修改起来也较为省时省力。
Scala 与 Java 语法上的明显差异有:
def
开头(与 Python、Ruby 相同)return
可以省略在此值得提醒的是,统计显示,Scala 的代码运行速率仅为 Java 的 8 成。
功能多啊,语法复杂啊,号称是JVM上的C++啊,话说搞Java的你不多学几个JVM上的语言都不好意思出门啊!什么?你说JRuby?这种渣脚本你也好意思拿出来说事?Groovy?丫不就一批处理么?BeanShell?丫还不如批处理呢?Clojure……好吧这个逼格比Scala高…………
Java 把编程简化到是个人都可以立马上手,通过静态语法检查,简明的语义等等约束使得开发不是一件难事。
这种简化必然导致开发效率的降低,因为它是通过语法层面的繁琐来降低开发的难度,所以它的抽象程度是不够的,但是也正是这种做法成就java近十年来最受欢迎的语言。
但是对于一些智商超群的牛人来说,用这种语言不是拉低他们的身份吗?所以类似Scala 这种语言出现了,高程度的抽象了语法,提升了开发的效率。
因为是高程度的抽象,必然会提供出很多语法糖,受到那些收java繁琐之苦的人的欢迎。最简单的例子就是它对于并发的抽象,大大降低了写并发的难度。
所以用Scala 还是 Java关键吗? 不关键,不要人云亦云,说什么新特性,那不是一点点糖而已。学一门,学深就够了。
楼上说得好,我再做点补充:
*1. 自动类型推导,val和var很爽,用Java写Map<String, Map<String, List
*2. 一切都是表达式,明显减少了语法限制,能玩出花来。
比如if条件里面可以写好几行
else if ({
val a = getA(...)
val b = getB(...)
(a, b) match {...}
}) {
//do something
}
一句初始化可以写好几行
val service = {
import aaa.bbb.Configuration
val conf = Configuration().setX("x").setY("y")
val serv = Service(conf)
serv.start()
serv
}
*3. 利用FP+语法糖可以编程实现简单的AOP,无需反射+代理。
def service(args) = transactional {
doBusinessThings(args)
}
15 回答8.4k 阅读
8 回答6.2k 阅读
1 回答4k 阅读✓ 已解决
3 回答6k 阅读
3 回答2.2k 阅读✓ 已解决
2 回答3.1k 阅读
2 回答3.8k 阅读
个人觉得比较运行速度其实没啥意义, 因为两种语言都是生成 JVM 的字节码, 依赖 JVM 这个虚拟平台来跑代码. 除非 Scalac (scala的编译器) 有重大 bug, 生成的字节码执行让人无法接受, 否则基本上不会相差太多. 再说, scala 都到大版本2了, 这种概率实在是不大.
相比较与 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 (Java 8 也开始引入 default method 了呢)
在 Java 中, 想要一个 singleton ? 要么在 static block 中做, 要么利用 Enum 的单例特性完成, 或者其他更纠结的方法.
在 Scala 中, 只要声明为
object
, 即为单例.在 Java 中, 想要延迟加载一个单例?
double check
吧在 Scala 中, 只要在
object
中将变量修饰为lazy
即可在 Java 中, 想要对集合进行一些操作? 使用一层一层的 for 循环吧
在 Scala 中, 使用 collection 的一些集合操作, 即可获得如写
SQL
般的享受.在 Java 中, 在并发中想对
Future
进行回调? 对不起,Future
不是 Listenable (无法支持回调), 除非你使用额外的工具(如 guava, spring)在 Scala 中, 本来就主张异步编程, future 和 promise 的配合让人非常愉快.
在 Java 中, 要透明扩展一个第三方库的类怎么办? 包装, 再加一层.
在 Scala 中, 有强大的 implicit 机制让你更优雅的做到这一点, 同时还能保证类型安全(比起 Ruby 的 monkey patch, 要安全得多)
Scala 的表达力很强, 相同功能的代码, 用 Java 和 Scala 的行数不可同日而语.
这些单单是语言层面上的优势, 除此之外, Scala 还能无缝结合 Java
尽管罗列了如此多的好处, 但 Scala 有如下劣势:
对于程序员来说: Scala 很难学, 但值得学
对于企业来说: Scala 是过滤优秀(好学)程序员(Geek)的好滤斗.