Scala 是 Scalable Language 的简写,是一门多范式的编程语言(函数式编程&面向对象编程)
Scala 是一门更简洁,更强大的语言通常而言,在大数据以及其他以数据为中心的计算领域里,应用Scala 和函数式编程能够构造杀手级应用。满足现代软件工程师需求的语言;它是一门静态类型语言,支持混合范式;它也是一门运行在 JVM 之上的语言,语法简洁、优雅、灵活。 Scala 拥有一套复杂的类型系统, Scala 方言既能用于编写简短的解释脚本,也能用于构建大型复杂系统
一 :Scala的特性:
面向对象特性
Scala是一种纯面向对象的语言,Scala 引入特征( trait)改进了 Java 的对象模型,每个值都是对象,即便是数值类型。
函数式编程
Scala也是一种函数式语言,其函数也能当成值来使用。Scala提供了轻量级的语法用以定义匿名函数,支持高阶函数,允许嵌套多层函数,并支持柯里化。Scala的case class及其内置的模式匹配相当于函数式编程语言中常用的
Scala 完全支持函数式编程( FP),函数式编程已经被视为解决并发、大数据以及代码正确性问题的最佳工具。使用不可变值、被视为一等公民的函数、无副作用的函数、高阶函数以及函数集合,有助于编写出简洁、强大而又正确的代码
更进一步,程序员可以利用Scala的模式匹配,编写类似正则表达式的代码处理XML数据。
二 :Scala基础
1:变量声明
在Scala中,允许在声明变量是可变的还是不可变(只读)的,不可变的用val关键字声明:
val str : String = "hello scala"
上例就是声明了一个String 类型的字符串str 并赋值为"hello scala"
val 在声明时必须被初始化
一个可变变量用关键字var来声明,var声明的变量是可变的,声明后可以再次对其赋值,但是也必须在声明的同时立即初始化
var price:double = 100.0
关于上述提到,val和var声明变量时必须初始化这一个规则,也有例外情况,比如这两个关键字均可以用在构造函数的参数中,这时候变量是该类的一个属性,因此显然不必在声明时进行初始化。此时如果用 val 声明,该属性是不可变的;如果用 var 声明,则该属性是可变的
为了减少可变变量在并发编程中,引起bug,应该尽可能的使用不可变变量,而比较常见的一种现象是当你正在使用的对象被其他人修改时,将引起对象产生不可预见的行为,这种bug往往是比较难查找的
2:分号
在Java和C 中,每个语句都以分号结束,而在Scala中,与JavaScript和其他脚本语言类似,行尾的位置不需要分号。同样 } ,else,以及类似的位置也不必写分号。
但是如果在单行中写下多个语句,就需要将它们以分号隔开,例如:
if(n < 0) { x = x * n; n -= 1 }
当然,如果你是java或者C 或者C#程序员,不适应没有分号的编程,那么你也可以加上分号,其实是没有影响的。只是没有分号更简洁一些。
3 :scala常用类型
和Java一样,Scala也有七种数值类型 :Byte ,Char,Short,Int,Long,Float和Double以及一个Boolean类型,和Java不同的是这些类型是类,Scala并不区分基本类型和引用类型,对于它来讲所以得类型都是一个类
在Scala中,我们用方法而不是强制类型转换来做数值类型之间的转换
4:方法声明
Scala 中声明方法的结构如下:
代码语言:javascript复制def hello( hi : String ) : Uint = {
println(hi)
}
如上定义了一个hello() 方法,方法的定义符为def 默认是public的,然后参数指定为字符串类型 hi,返回值为Uint 也就是java中的void,然后后面紧跟着 = { } 花括号里面是方法体
如果函数的返回值是Uint的,那么我们也可以将其省略掉,如下:
代码语言:javascript复制def hello(hi :String)={ }
方法的返回值
前面我们定义了一个Uint的函数,如果我们要定义一个有返回类型的函数的话,就直接将Uint改为对应的返回类型即可。如下:
代码语言:javascript复制def hello(hi:String):String = {
hi
}
在前面方法返回值的例子中,我们也看到了,我直接将传入的参数hi直接返回去了,但是没有用return这个关键字,是的。在Scala中,方法返回值最终是不需要return来修饰的,Scala会自动的推导出返回值
5:类型推断
先来看一段Java代码
代码语言:javascript复制HashMap<Integer, String> intToStringMap = new HashMap<Integer, String>();
我们不得不两次指定类型参数 <Integer, String>。 Scala 使用类型注解一词表示类似
HashMap<Integer, String> 的显式类型声明。
Java 7 引入了尖括号操作符来推断表达式右边的泛型类型,降低了冗余度:
HashMap<Integer, String> intToStringMap = new HashMap<>();
利用自动推断类型信息,以上声明可以用 Scala 重写如下:
val intToStringMap: HashMap[Integer, String] = new HashMap
如果我们也可以将 HashMap[Integer, String] 放在等号后边,代码会更简洁:
val intToStringMap2 = new HashMap[Integer, String]
但是在有些情况下,我们必须显式类型注解,比如 :
声明了可变的 var 变量或不可变的 val 变量,没有进行初始化。(例如,在类中的
抽象声明,如 val book: String, var count: Int)。
- 所有的方法参数(如 def deposit(amount: Money) = {… })。
- 方法的返回值类型,在以下情况中必须显式声明其类型。
– 在方法中明显地使用了 return(即使在方法末尾也是如此)。
– 递归方法。
– 两个或多个方法重载(拥有相同的函数名),其中一个方法调用了另一个重载方
法,调用者需要显式类型注解。
– Scala 推断出的类型比你期望的类型更为宽泛,如 Any。
6:保留字
列出了 Scala 的保留字。其中的一些我们之前已经遇到过,还有许多保留字在 Java
中也能找到,并且它们在两种语言中的含义是相同的。