目录
一、大数据为什么学习Scala
1.
优雅:这是框架设计师第一个要考虑的问题,框架的用户是应用开发程序员,
API
是否优雅直接影响用户体验。
2.
速度快:
Scala
语言表达能力强,一行代码抵得上
Java
多行,开发速度快;
Scala
是静态编译的,所以和
JRuby
,Groovy比起来速度会快很多。
3.
能融合到
Hadoop
生态圈:
Hadoop现在是大数据事实标准,Spark是由Scala开发的,Spark并不是要取代
Hadoop
,而是要完善
Hadoop
生态。JVM语言大部分可能会想到
Java
,但
Java
做出来的
API
太丑,或者想实现一个优雅的
API
太费劲。而Fink也有Scala的PAI接口
二、 Scala起源
Scala名字由来:
Scalable Language
两个单词相结合;意大利语中
“scala”
意为
“
梯子
”
或
“
楼梯
”
,蕴含
“
更佳的编程语言”。
Scala之父
Martin Odersky
(马丁
·
奥德斯基)于
2001
年基于
Funnel
的工作开始设计
Scala
。
Funnel
是把函数式编程思想和Petri
网相结合的一种编程语言。
Martin Odersky
先前的工作是
Generic Java
和
javac
(
Sun Java
编译器)。
Java平台的
Scala
于
2003
年底
/2004
年初发布。
.NET
平台的
Scala
发布于
2004
年
6
月。该语言第二个版本,
v2.0
,发 布于2006
年
3
月。截至2009年
9
月,最新版本是版本
2.7.6
。
Scala 2.8
预计的特性包括重写的
Scala
类库(
Scala collections library)、方法的命名参数和默认参数、包对象(
package object
),以及
Continuation
2009年
4
月,
Twitter
宣布他们已经把大部分后端程序从
Ruby
迁移到
Scala
,其余部分也打算要迁移。此外,Wattzon已经公开宣称,其整个平台都已经是基于
Scala
基础设施编写的。
Scala 的预期目标是将面向对象、函数式编程和强大的类型系统结合起来,同时让人要能写出优雅、简洁的代码。
Scala博采众长,
Scala
采用了
Java
和
C#
语法的大部分,而他们大部分借自于
C
,
C++
语法。表达式、语句、和代码块和Java
一样,还有类、包和引用的语法。除语法之外,
Scala
还采用了
Java
的其他元素,如它的基本类型、类库和它的执行模式。函数式编程借鉴了SML
,
OCaml
,和
F#
为代表的
ML
家族语言很接近,
Scala
的隐式参数灵感来自Haskell,基于
actor
的并发库来自
EeLang
的思想。
三、Scala特点
1.面向对象
Scala中的每个值都是一个对象,包括基本数据类型(即布尔值、数字等)在内,连函数也是对象。 类可以被子类化,而且Scala
还提供了基于
mixin
的组合(
mixin-based composition
)。
类抽象机制的扩展有两种途径:一种途径是子类继承,另一种途径是灵活的混入机制。这两种途径能避免多重继承 的种种问题。
2.函数式编程
Scala也是一种函数式语言,其函数也能当成值来使用。
Scala
提供了轻量级的语法用以定义匿名函数,支持高阶函数,允许嵌套多层函数,并支持柯里化。Scala
的
case class
及其内置的模式匹配相当于函数式编程语言中常用的代数类型。
更进一步,程序员可以利用Scala的模式匹配,编写类似正则表达式的代码处理XML
数据
3.静态类型
Scala具备类型系统,通过编译时检查,保证代码的安全性和一致性。类型系统具体支持以下特性:
- 泛型类
- 协变和逆变
- 标注
- 类型参数的上下限约束
- 把类别和抽象类型作为对象成员
- 复合类型
- 引用自己时显式指定类型
- 视图
- 多态方法
4.扩展性
Scala的设计秉承一项事实,即在实践中,某个领域特定的应用程序开发往往需要特定于该领域的语言扩展。
Scala提供了许多独特的语言机制,可以以库的形式轻易无缝添加新的语言结构:
-
任何方法可用作前缀或后缀操作符
-
可以根据预期类型自动构造闭包。
5.动态性
Scala使用
Actor
作为其并发模型,
Actor
是类似线程的实体,通过邮箱发收消息。
Actor
可以复用线程,因此可以在程序中可以使用数百万个Actor,
而线程只能创建数千个。在
2.10
之后的版本中,使用
Akka
作为其默认
Actor
实现。
四、什么是函数式编程
函数式编程是一种"编程范式"(programming paradigm),也就是如何编写程序的方法论。
纯粹的函数式编程语言编写的函数没有变量,因此,任意一个函数,只要输入是确定的,输出就是确定的,这种纯函数我们称之为没有副作用。而允许使用变量的程序设计语言,由于函数内部的变量状态不确定,同样的输入,可能得到不同的输出,因此,这种函数是有副作用的。
函数式编程的特点:
-
函数是一等公民 :指的是函数与其他数据类型一样,处于平等地位,可以赋值给其他变量,也可以作为参数,传入另一个函数,或者作为别的函数的返回值。
- 以表达式为中心
-
无副作用 : 只用纯函数来构造程序,或者说函数没有副作用。 什么是副作用?一个带有副作用的函数不仅有一个返回 值,还可能做了:
1.修改一个变量
2.直接修改数据结构
3.设置一个对象的成员
4.打印到终端或者读取用户输入
5.读取或写入一个文件
6.在屏幕上绘画
7.抛出一个异常或以一个错误终止
一个函数在程序执行过程中除了根据输入参数给出运算结果外,没有其他的影响,就称为没有副作用的。
-
不修改状态 :状态不能保存在变量中
-
引用透明:不依赖外部变量或状态
函数式编程优势:
- 代码简洁,开发速度快
-
接近自然语言,易理解
-
易于代码管理:函数式编程不依赖、也不会改变外界的状态,只要给定输入参数,返回的结果必定相同。因此,每一个函数都可以被看做独立单元,很有利于进行单元测试(unittesting )和除错( debugging ),以及模块化组合。
-
适合并发编程:函数式编程不需要考虑 " 死锁 " ( deadlock ),因为它不修改变量,所以根本不存在 " 锁 " 线程的问题。不必担心一个线程的数据,被另一个线程修改,所以可以很放心地把工作分摊到多个线程,部署" 并发编程" ( concurrency )。
-
适用于热升级:函数式编程没有副作用,只要保证接口不变,内部实现是外部无关的。所以,可以在运行状态下直接升级代码,不需要重启,也不需要停机
函数式编程的一个特点就是,函数也是值,同允许把函数本身作为参数传入另一个函数,还允许返回一个函数!
五、什么是静态语言和动态语言
#
静态编译语言:实现声明变量类型,类型不能改变,编译时检查;
#
动态编译语言:不用事先声明类型,随时可以赋值为其他类型,编程时不知道什么类型,很难推断;
静态语言和动态语言关键区别是何时获得类型信息,是在编译时间还是运行时间。
六、什么是强类型和弱类型语言
#
强类型语言:不同类型之间操作,必须强制类型转换为同一类型,
print('a'+1):
#
弱类型语言:不同类型间可以操作,自动隐式转换。
强类型和弱类型语言的区别关键是类型之间的区别是否严格,例如语言是否会做字符串类型到数字类型的隐式转换。
// 弱类型语言 JavaScript ,在线测试: http://jsrun.net/newa = 1b = a + "1" + "a" // 结果是 11a, 这里 a 成了字符串c = a + 1 // 结果是 2 , 这里 a 则是数字型// 强类型语言 :Java ,在线测试: http://www.dooccn.com/java/int a = 2 ;String b = String . valueOf ( a ) + "1" + "a" ;int c = a + 1 ;