scala学习:
第二章:表达式
几乎所有的控制语句都有值,
条件表达式的值是其true分支的返回值,其类型也是
所有基础类型的公共超类:Any
变量名:类型名=初始值
Unit:一个无值的值,占位符{}, 类似于Void
块:用{}包含,最后一个表达式的值是块的值
打印使用print和println
也支持printf
for(i <- 1 to n)
{
//遍历1到N中的所有值
}
<-是遍历操作符,
for (i <- 0 util s.length) 不包含上限
for循环可以带一个guard 语句,
for循环体中带yield语句,输出一个集合vector类型,集合推导式
函数
不需要指定返回类型,除非是递归的
可以通过最后的表达式的值来推断其返回值,所以并不需要使用return, 除非当做break来提前返回
参数可以有默认值,也支持变长参数,类型为seq
可以用_*转换区间参数为参数序列seq
过程
返回类型为unit的函数,没有=
val lazy 变量推迟初始化,直到变量被其它地方使用到
Exception 的类型是Nothing
使用_代替变量名
数组
长度固定数组:new Array[Int](10)
Array("hello","world")
有初始值就不用new
变长数组:ArrayBuffer[Int]()
for(i <- 区间)
for(elem <- a)
for() yield产生一个同原数组类型相同的新的Array
同理产生ArrayBuffer
for(...)中也可以加guard if语句
可以直接对Array排序,求和等,但不能对ArrayBuffer排序
显示数组的内容,使用mkString函数
Array会被转换为ArrayOps下再执行相关的方法
函数返回类型为Unit指没有任何返回值
命令行中输入:q 退出
函数式编程:函数是第一类结构
scala本质上没有操作符重载,只是可以把操作符当做函数名来对待
对一个变量做括号操作时,scala会转换为对apply方法的调用,即a(i)转换为a.apply(i)
greetStrings(0) = "Hello"转换为greetStrings.update(0, "Hello")的调用
val numNames = Array("zero", "one", "two")//创建一个不可变长的数组对象,但具体的某项值是可变的
val oneTwoThree = List(1, 2, 3)//List是不可变的
val oneTwoThreeFour = oneTwo ::: threeFour//list的加
如果要用可变列表,则使用ListBuffer
元组:tuple也是不可变的,但可以同时包含不同类型的元素
直接用()构造:val pair = (99, "Luftballons")但不能使用(0)这样来访问,只能用pair._1,最多22个
trait: 特质,类似于接口,其set也有2个trait:一个可变,一个不可变
scala.collection.immutable.Set为不可变的set
map也是分了2个trait: 1个可变,1个不可变
没有指定import时,缺省是不可变的map
从指令式(imperative)编程到函数式编程: