Scala是一门满足现代软件工程师需求的语言;它是一门静态类型语言,支持混合范式;它也是一门运行在JVM之上的语言,语法简洁、优雅、灵活。Scala拥有一套复杂的类型系统,Scala方言既能用于编写简短的解释脚本,也能用于构建大型复杂系统。这些只是它的一部分特性,下面我们来详细说明。
● 运行在 JVM 和 JavaScript 之上的语言
Scala不仅利用了JVM的高性能以及最优化性,Java丰富的工具及类库生态系统也为其所用。不过Scala并不是只能运行在JVM之上! Scala.js(http://www.scala-js.org)正在尝试将其迁移到JavaScript世界。
● 静态类型
在Scala语言中, 静态类型 (static typing)是构建健壮应用系统的一个工具。Scala修正了Java类型系统中的一些缺陷,此外通过类型推演(type inference)也免除了大量的冗余代码。
● 混合式编程范式——面向对象编程
Scala完全支持 面向对象编程 (OOP)。Scala引入 特征 (trait)改进了Java的对象模型。trait能通过使用 混合结构 (mixin composition)简洁地实现新的类型。在Scala中,一切都是对象,即使是数值类型。
● 混合式编程范式——函数式编程
Scala完全支持 函数式编程 (FP),函数式编程已经被视为解决并发、大数据以及代码正确性问题的最佳工具。使用不可变值、被视为一等公民的函数、无副作用的函数、高阶函数以及函数集合,有助于编写出简洁、强大而又正确的代码。
● 复杂的类型系统
Scala对Java类型系统进行了扩展,提供了更灵活的泛型以及一些有助于提高代码正确性的改进。通过使用类型推演,Scala编写的代码能够和动态类型语言编写的代码一样精简。
● 简洁、优雅、灵活的语法
使用Scala之后,Java中冗长的表达式不见了,取而代之的是简洁的Scala方言。Scala提供了一些工具,这些工具可用于构建 领域特定语言 (DSL),以及对用户友好的API接口。
● 可扩展的架构
使用Scala,你能编写出简短的解释性脚本,并将其粘合成大型的分布式应用。以下四种语言机制有助于提升系统的扩展性:1 )使用trait实现的混合结构;2 )抽象类型成员和泛型;3) 嵌套类;4 )显式 自类型 (self type)。
Scala实际上是Scalable Language的缩写,意为可扩展的语言。Scala的发音为scah-lah,像意大利语中的staircase(楼梯)。也就是说,两个a的发音是一样的。
早在 2001 年,Martin Odersky便开始设计Scala,并在 2004 年 1 月 20 日推出了第一个公开版本(参见http://article.gmane.org/gmane.comp.lang.scala/17)。Martin是瑞士洛桑联邦理工大学(EPFL)计算机与通信科学学院的一名教授。在就读研究生时,Martin便加入了由Niklaus Wirt 领导的PASCAL fame项目组。Martin曾任职于Pizza项目组,Pizza是运行在JVM平台上早期的函数式语言。之后与Haskell语言设计者之一Philip Wadler一起转战GJ。GJ是一个原型系统,最终演变为Java泛型。Martin还曾受雇于Sun公司,编写了javac的参考编译器,这套系统后来演化成了JDK中自带的Java编译器。
自从本书第1版出版之后,Scala用户数量急剧上升,这也证实了我的观点:Scala适应当前时代。当前我们会遇到很多技术挑战,如大数据、通过并发实现高扩展性、提供高可用并健壮的服务。Scala语法简洁但却富有表现力,能够满足这些技术挑战。在享受Scala最先进的语言特性的同时,你还可以拥有成熟的JVM、库以及生产工具给你带来的便利。
在那些需要努力才能成功的领域里,专家们往往都需要掌握复杂强大的工具和技术。也许掌握这些工具技能需要花费一些时间,但是掌握它们是你事业成功的关键,所以花费这些时间都是值得的。
我确信对于专家级开发者而言,Scala就是这样一门语言。并不是所有的用户都能称得上是专家,而Scala却是属于技术专家的语言。Scala包含丰富的语言特性,具有很好的性能,能够解决多种问题。虽然需要花一些时间才能掌握Scala语言,但是一旦你掌握了它,便不会被它束缚。
自从Java 5 引入泛型之后,再也没有哪次升级能比Java 8 引入更多的特性了。现在可以使用真正的匿名函数了,我们称之为Lambda。通过本书你将了解到这些匿名函数的巨大作用。Java 8 还改进了接口,允许为声明的方法提供默认实现。这一变化使得我们能够像使用混合结构那样使用接口,这也使接口变得更有用了,而Scala则是通过trait实现这种用法的。在Java 8 推出之前,Scala便已为Java提供了这两个被公认为Java 8 最重要的新特性。现在是不是能说服自己切换到Scala了?
由于Java语言向后兼容的缘故,Scala新增了一些改进,而Java也许永远不会包含。即便Java最终会拥有这些改进,那也需要漫长的等待。举例来说,较Java而言,Scala能提供更为强大的类型推演、强大的 模式匹配 (pattern matching)和for 推导式 (forcomprehension),善用模式匹配和for推导式能够极大地减少代码量以及类型耦合。随着深入学习,你会发现这些特性的巨大价值。
另外,一些组织对升级JVM设施抱有谨慎态度,这是可以理解的。对于他们而言,目前并不允许部署Java 8 虚拟机。为了使用这些Java 8 特性,这些组织可以在Java 6 或Java 7的虚拟机上运行Scala。
你也许因为当前使用Java 8,就认为Java 8 是最适合团队的选择。即便如此,本书仍然能给你传授一些有用的技术,而且这些技术可以运用在Java 8 中。不过,我认为Scala具有一些额外的特性,能够让你觉得值得为之改变。
好吧,让我们开始吧!