变量定义
1  | val hello="Hello Scala"  | 
注:
val 相当于Java中的final关键字修饰的变量,一旦赋值便不能更改
当未指定类型时,Scala会根据实际类型进行类型推断,上面前三种方式结果相同
lazy关键字修饰的变量,定义时不赋值,真正使用时才赋值
var关键字修饰的变量,可以被重新赋值
e也可以是大写E,0.1214e1 = 0.131410e也可以是大写E,0.1214e2 = 0.13141010
函数定义
1  | def max(x:Int, y:Int):Int={  | 
def:关键字,定义一个函数
max:自定义的方法名
(x:Int, y:Int):方法名后小扩号中为参数列表
Int:参数后的Int为方法返回值类型
{…}:大扩号中为方法体
Scala函数返回值可以不加return,默认函数体最后一条语句为返回值
函数体不指定返回值时,scala会根据实际类型进行类型推断
Unit关键字表示函数不存在返回值,相当于java中的void关键字
Scala每行语句结束后的分号可加可不加
Scala基本类型
| Value type | Range | 
|---|---|
| Byte | 8-bit | 
| Short | 16-bit | 
| Int | 32-bit | 
| Long | 64-bit | 
| Char | 16-bit | 
| Float | 32-bit | 
| Double | 64-bit | 
| Boolean | true or false | 
| String | 
算术操作+ - * / %
- 在Scala中一切操作皆方法,这意味着Scala中的一切毕为对象
 1+2整数求和时,编译器会将其转换为(1).+(2)执行,所以下面两种方式是相等的
var sum =1+2
var sum=(1).+(2)操作符重载,编译器会将其转换为(1).+(2L)执行结果等于3
var longsum = 1 + 2LScala中可以用+ -符号来表示正负数,例如:-3+3
var y= 1+ -3
var y= -3+3
关系运算符
= < ⇐ ! ==
逻辑运算符
! && ||
位运算
&(按位与) |(按位或) ^(按位异或) ~(按位取反) «(左移) »(带符号右移) »>(无符号右移)
1  | //00000001  | 
对象比较
- Scala中的对象比较不同于Java中的对象比较
 - Scala基于内容的比较,而Java中比较的是引用地址
 - Scala eq 方法是基于引用地址的比较
 
1  | scala> 1==1  | 
运算符的优先级
扩号优先级最高
* / %
+ -
:
= !
< >
& 
字符串的操作
var str = “hello”
- 定义的String类型变量可以使用java中String的所有方法
 - 隐式转换:Scala把String类型转换成StringOps,其中包括了所有的immutable sequence的方法。碰到reverse,map,drop和slice方法时编译器会自动插入这个转换。
 - Scala方法的调用可以不加点“.”,直接用空格调用,并且可以省略扩号
 
1  | str.indexOf(“o”)  | 
if的使用
- Scala会自动进行类型推断
 
1  | scala> var x = if("hello"=="hello")1 else 2  | 
while的使用
1  | def main(args: Array[String]): Unit = {  | 
do while的使用
1  | def main(args: Array[String]): Unit = {  | 
Scala具有函数式编程语方的特点,在函数式编程语方当中,一般不推荐使用var变量
利用if替代while控制结构,可以减少var变量的使用,程序结构也更简单,表达能力更强
1  | def loop(x:Int):Unit={  | 
for循环的使用
- 打印当前目录所有文件名
 
- ← 生成器(generator),在执行过程中,集合files中的Array[File]的元素将依次赋值给file,file类型为File,输出时调用其toStirng方法将文件名打印出来
 
1  | val files = (new java.io.File(".")).listFiles  | 
- for循环中加入if过滤操作
 
1  | val files = (new java.io.File(".")).listFiles  | 
- 加入多个过滤条件
 
1  | for(file <- files if file.isFile; if file.getName.endsWith("iml")) println(file)  | 
4.多重循环的实现
1  | def main(args: Array[String]): Unit = {  | 
yield 关键字在循环中生成返回结果
1  | def main(args: Array[String]): Unit = {  | 
Array数组操作
定长数组Array
1  | Scala中的Array是以Java中的Array方式实现的  | 
变长数组ArrayBuffer
1  | scala.collection.mutable.ArrayBuffer  | 
List
List的定义
1  | val cars = List(“bmw”,“volvo”)  | 
list常用操作
1  | 判断是否为空  | 
1  | scala> val arr = List("1","6","3","5","9")  | 
插入排序算法
1  | def sort(xs:List[Int]) :List[Int] ={  | 
List连接操作 :::
1  | scala> List(1,2):::List(3,4)  | 
list相等判断
1  | val arr = List(1,6,3,5,9)  | 
range方法,构建某一值范围内的List
val nums = List.range(2,9)
range主法,指定步长N,范围不存在的返回空List
val nums = List.range(2,100, 5)
val nums = List.range(100,20, -5) 
flatten,将列表平滑成第一个元素
1  | scala> List(List("aaa","bbb"),List("111","222")).flatten  | 
concat列表链接
1  | scala> List.concat(List("aaa","bbb"),List("111","222")) res32: List[String] = List(aaa, bbb, 111, 222) \\  | 
Set
Set 不可重复,无序的集合
如果需要按添加顺序排序,可以使用LinkedHashSet实现 
val set = Set(1,2,3)
val mutableSet = mutable.Set(1,2,3) 
添加元i
set+5 
遍历Set
for(i ← set+7)print(i) 
Map
val map = Map(1 → “one”,“two” → 2,2.3 → “three”)
val mutableMap = mutable.Map(1 → “one”,“two” → 2,2.3 → “three”)
println(map) 
添加元素
println(map.+(4 → “four”)) 
删除元素
println(map.-(“tow”)) 
遍历map
1  | for(i<-map)println(i+"\t"+i._1+"\t"+i._2)  | 
mutable map可以使用put添加元素
val mutableMap = mutable.Map(1 → “one”,“two” → 2,2.3 → “three”)
mutableMap.put(“four”,4)
判断key是不存在 map.contains(1) map.get(“key”)
Queue队列
immutable queue
scala> var queue=scala.collection.immutable.Queue(1,2,3)
queue: scala.collection.immutable.Queue[Int] = Queue(1, 2, 3) 
出队
scala> queue.dequeue
res38: (Int, scala.collection.immutable.Queue[Int]) = (1,Queue(2, 3)) 
入队
scala> queue.enqueue(4)
res40: scala.collection.immutable.Queue[Int] = Queue(1, 2, 3, 4) 
mutable queue
scala> var queue=scala.collection.mutable.Queue(1,2,3,4,5)
queue: scala.collection.mutable.Queue[Int] = Queue(1, 2, 3, 4, 5) 
入队操作
scala> queue += 5
res43: scala.collection.mutable.Queue[Int] = Queue(1, 2, 3, 4, 5, 5) 
集合方式
scala> queue ++= List(6,7,8)
res45: scala.collection.mutable.Queue[Int] = Queue(1, 2, 3, 4, 5, 5, 6, 7, 8) 
Scala.collection
scala会默认导入以几个包:
import java.lang
import scala.
import Predef._ 
Predef对象中包含了Set、Map等的定义 
在Scala中,默认使用的immutable集合,如果需要使用mutable集合,需要在在程序中import
immutable 不可变的集合,一量被创建,便不能被改变,添加、删除、更新操作返回的是新的集合,原集合保持不变 
mutable 可变的集合,可以更新或修改,添加、删除、修改元素将作用于原集合 
scala.collection包中的集合类层次结构如下图:
scala.collection.immutable包中的类层次结构:
scala.collection.mutable包中的类层次结构:
可变集合与不可变集合对应关系:
函数字面量(值函数)
函数字面量(function literal),也称值函数(function values),指的是函数可以赋值给变量。
1  | val increase=(x:Int)=>x+1  | 
函数简化
大扩号中只有一行操作时,大扩号可以省掉, 
方法的调用可以省略“.”,用空格代替
*参数类型推断写法 
1  | println(Array(1,2,3) map((x)=>x+1) mkString ",")  | 
*函数只有一个参数的话,可以省略()
1  | scala> Array(1,2,3,4) map{x=>x+1} mkString(",")  | 
*如果参数右边只出现一次,则可以进一步简化
1  | scala> Array(1,2,3,4) map{_+1} mkString(",")  | 
*值函数简化
1  | val fun1=1+(_:Int)  | 
*函数参数,即将一个函数做为参数传入
1  | def convertIntToString(f:(Int)=>String)=f(4)  | 
函数闭包(Closure)
(x:Int)⇒x+more,这里的more是一个自由变量(Free Variable),more是一个没有指定含义的不定变量
而x的类型确定,值在函数调用的时候被赋值,称这种变量为绑定变量(Bound Variable) 
1  | (x:Int)=>x+more  | 
*像这种运行时确定more类型及值的函数称为闭包,more是个自由变量,在运行时值和类型得以确定,这是一个由开放(free)到封闭的过程。