目录
2.1 for(变量 <- 表达式;变量<-表达式){语句块}
2.2 for(变量 <- 表达式 if 条件表达式) 语句块
1、scala与java的if else的不同
scala中的if表达式可以有值
val x=6
val a=if(x>0) 1 else -1
2、for
2.1 for(变量 <- 表达式;变量<-表达式){语句块}
变量 <- 表达式被称为生成器,支持多个生成器,用分号隔开
表达式:Range(a,b,c) 起始、终点、步长
1 to 5 by 2 步长为2
2.2 for(变量 <- 表达式 if 条件表达式) 语句块
if条件满足时才执行语句块中的内容2.3
val r=for(i <- Array(1,2,3,4,5) if i%2==0) yield {println(i); i}
yield中的i返回给r,每一次for的i都不同所以r最后是一个数组
输出2,4
r:Array[Int]=Array(2,4)
3、异常
Java中分为受检异常和不受检异常
受检异常:程序员自己知道可能会发生哪些错误并给出处理方法
不受检异常:运行时才抛出来
scala中都是不受检异常
用try catch处理
4、循环控制
scala.util.control
4.1 终止从当前开始的所有循环
4.2 终止当次循环,继续下一个循环对象
5、数组
相同类型的数据聚合
val str=new Array[String](3) 声明长度为3的字符串数组,每个数组元素初始化为null
val a=Array(1,3,4) 通过小括号来访问数组内的元素 不一定要给出类型,因为有自动类型推断机制
println(a(0))
多维数组:
三行四列的二维数组
myMatrix(0)(1)
6、元组
对多个不同类型对象的一种简单封装
用括号封起来就表示是个元组,通过“ ._ ”访问其中的元素
val tuple=("Big",2018,9)
println(tuple._1)
//Big
当一个方法执行完后可能需要返回多个不同数据类型的对象
tuple可返回多个不同类型对象
7、容器 collection
scala提供了非常丰富的容器库:序列、集合、映射
容器类的三个包:
scala.collection封装了一些超类和特质(特质=java的接口)
继承:
Seq,Set,Map的区别:
索引方式:
Seq(比如向量)按0,1,2等进行索引
Map按键索引
Set是乱序的,无索引结构
7.1 序列容器
序列容器的根:scala.collection.Seq
序列中的两个子特质:LinearSeq、IndexedSeq
不同的子特质满足不同的应用需求:LinearSeq适合取头或者取尾巴操作,而IndexedSeq有高效的随机存取操作
7.2 列表
列表从LinearSeq继承而来,列表是一个具体的容器类:具有相同类型且不可变,声明时就必须初始化(.head;.tail)
初始化:var strList=List("big","spark")
访问头尾:.head .tail
合并列表:val otherList="apache"::strList //没有覆盖原来的strList,而是生成了新的副本,把新的副本赋值给了otherList
快速得到一个列表:val intList = 1::2::3::Nil
“::”表示右结合,从右到左结合
7.3 Vector
Vector添加新元素:+:与:+
7.4 Range:即使数据结构也是容器
是一种特殊的带索引的等差数列
new Range(1,5,2)
1 utill 5
1 to 10 by 2
7.5 集合
其中元素不允许重复
集合中通过Hash方法快速查询到值,而列表通过遍历,比集合慢得多
可变与不可变的Set:
?缺省情况下创建的是不可变的Set
var mySet = Set("Hello","spark") //scala中不用new也可以创建一个对象 对象本身是不可变集 但变量是可变的
mySet += "Scala" //生成新的不可变集 并重新赋值给mySet,相当于mySet的指针变了一下
?可变Set的创建
import scala.collection.mutable.Set
val myMutableSet=Set("a","b") //可变集赋值给不可变量
myMutableSet += "Cloud Computing" //把指针指向的数据集改变了(多加了一个Cloud...)
7.6 映射 Map
数据结构,键值对,键唯一,值不唯一
默认也是不可变映射,可变映射要导入scala.collection.mutable.Map
val university = Map("XMU" -> "XiaMen University","PKU" -> "Peking University")
通过键访问值:val xmu = if(university.contains("XMU")) university("XMU") else 0;println(xmu)
可变的映射(Map):
更新该键已有的值:university2("XMU")="Ximan Uni"
添加新元素(多个用逗号隔开):university2("YNNU")="YunnanNormal Uni"
或 university2+=("YNNU"->"YunnanNormal Uni","FZ"->"Fuzhou")