变量定义
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)到封闭的过程。