可以用 简洁,优雅,美丽大方来形容scala语言的特点(或者说装逼,因为代码量少,很简洁)
Java20行代码,可能用Scala只需一行,目前Java新版本正在模仿Scala语言的特性,可以说函数式编程在以后会越来越广泛
如果你在写Scala的时候忘记了Scala代码怎么写,你也可以在Scala的代码中写Java代码,毕竟都是运行在JVM之上的
Scala 概述
1.什么是Scala?
统计世界top100大学计算机系年级前三名,从初中开始编程,学过20多种语言,最后认为Scala最难。好了,我们开始享受这个过程吧
Scala是一种多范式的编程语言,其设计的初衷是要集成面向对象编程和函数式编程的各种特性。
Scala 产生于瑞士的洛桑联邦理工学院(EPFL),是“可扩展语言”(Scalable Language)的缩写,
Sala 是一门静态类型语言,是一门以Java 虚拟机为目标运行环境并将面向对象和函数式编程语言的最佳特性结合在一起的编程语言。
你可以使用Scala 编写出更加精简的程序,也能用于构建大型复杂系统,并且他可以访问任何Java 类库并且与Java 框架进行互操作
Scala运行于Java平台(Java虚拟机),并兼容现有的Java程序。
2. 为什么要学Scala?
优雅:这是框架设计师第一个要考虑的问题,框架的用户是应用开发程序员,API是否优雅直接影响用户体验。
速度快:Scala语言表达能力强,一行代码抵得上Java多行,开发速度快;Scala是静态编译的,所以和JRuby,Groovy比起来速度会快很多。
能融合到Hadoop生态圈:Hadoop现在是大数据事实标准,Spark并不是要取代Hadoop,而是要完善Hadoop生态。JVM语言大部分可能会想到Java,但Java做出来的API太丑,或者想实现一个优雅的API太费劲。
3.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提供了轻量级的语法用以定义匿名函数,支持高阶函数,允许嵌套多层函数,并支持柯里化。Scala的case class及其内置的模式匹配相当于函数式编程语言中常用的代数类型。
- 复杂的类型系统
Scala 对Java 类型系统进行了扩展,提供了更灵活的泛型以及一些有助于提高代码正确性的改进。通过使用类型推演,Scala 编写的代码能够和动态类型语言编写的代码一样精简。类型系统通过编译时检查,保证代码的安全性和一致性。类型系统具体支持以下特性:
泛型类
协变和逆变
标注
类型参数的上下限约束
把类别和抽象类型作为对象成员
复合类型
引用自己时显式指定类型
视图
多态方法
- 简洁、优雅、灵活的语法
使用Scala 之后,Java 中冗长的表达式不见了,取而代之的是简洁的Scala 方言。Scala 提供了一些工具,这些工具可用于构建领域特定语言(DSL),以及对用户友好的API 接口。
- 可扩展的架构
使用Scala,你能编写出简短的解释性脚本,并将其粘合成大型的分布式应用。
以下四种语言机制有助于提升系统的扩展性:
1) 使用trait 实现的混合结构;
2) 抽象类型成员和泛型;
3) 嵌套类;
4) 显式自类型(self type)。
Scala的设计秉承一项事实,即在实践中,某个领域特定的应用程序开发往往需要特定于该领域的语言扩展。Scala提供了许多独特的语言机制,可以以库的形式轻易无缝添加新的语言结构:
任何方法可用作前缀或后缀操作符
可以根据预期类型自动构造闭包。
- 并发性
Scala使用Actor作为其并发模型,Actor是类似线程的实体,通过邮箱发收消息。Actor可以复用线程,因此可以在程序中可以使用数百万个Actor,而线程只能创建数千个。在2.10之后的版本中,使用Akka作为其默认Actor实现。
4.Scala Web 框架
以下列出了两个目前比较流行的 Scala 的 Web应用框架:
Lift 框架
Play 框架
如果要使用Scala做Web开发可以学习这些框架,做大数据开发,得学习Spark框架,它的底层是使用Scala编写的
5.谁使用了 Scala
2009年4月,Twitter宣布他们已经把大部分后端程序从Ruby迁移到Scala,其余部分也打算要迁移。
此外,Wattzon已经公开宣称,其整个平台都已经是基于Scala基础设施编写的。
瑞银集团把Scala用于一般产品中。
Coursera把Scala作为服务器语言使用。
6.扩展
https://www.zhihu.com/question/19748408
https://www.zhihu.com/question/25679583?sort=created
https://www.zhihu.com/question/26707124
http://www.mamicode.com/info-detail-663480.html
动态语言和静态语言
1.动态类型语言:是指在运行期间才去做数据类型检查的语言。在用动态语言编程时,不用给变量指定数据类型,该语言会在你第一次赋值给变量时,在内部将数据类型记录下来。Python 和Ruby 就是一种典型的动态类型语言;
2.静态类型语言:与动态类型语言刚好相反,它的数据类型检查发生在在编译阶段,也就是说在写程序时要声明变量的数据类型。C/C++、C#、JAVA 都是静态类型语言的典型代表。注意:Scala是一门静态类型的语言,但是类型声明可以省略(有自动类型推断机制,Java10开始也有了自动类型推断机制)
动态语言和静态语言
1.动态类型语言:是指在运行期间才去做数据类型检查的语言。在用动态语言编程时,不用给变量指定数据类型,该语言会在你第一次赋值给变量时,在内部将数据类型记录下来。Python 和Ruby 就是一种典型的动态类型语言;
2.静态类型语言:与动态类型语言刚好相反,它的数据类型检查发生在在编译阶段,也就是说在写程序时要声明变量的数据类型。C/C++、C#、JAVA 都是静态类型语言的典型代表。注意:Scala是一门静态类型的语言,但是类型声明可以省略(有自动类型推断机制,Java10开始也有了自动类型推断机制)
面向XX 编程:
面向过程编程:整个程序按照步骤编写,程序更着重业务步骤的。
面向对象编程:提出对象封装概念,将业务修改成对象之间的关系处理。
面向接口编程:更高层次的抽象,将业务抽象成一些接口规则框架。
面向切面编程:另一个思考维度,着重于业务逻辑的动态组织。
命令式编程:关心解决问题的步骤
函数式编程:关心数据的映射,是数学函数,不是程序中的函数概念