1.变量:
使用val 来定义常量 val x = 3 x不可以在被赋值为其他的值
使用var 来定义变量 var x = 3
使用lazy val 开定义惰性常量,常量在真正被用到的时候才会被计算
2.数值类型:
数值类型与java中类似,有Byte Short Int Long Float Double
eg: var x : Int = 3
eg var y : Floaf = 4
eg var z : Double = 3.456
Nothing用来表示函数出现异常 def f = throw new Exception("wer")
Unit表示函数返回空 : def f00 = {} var x = ();
3.函数的声明
def functionName(parameter:类型):返回值类型 = {
书写代码块
}
返回值类型可以省略 :
def functionName(parameter:类型) = {
代码块
}
4.if else & for
if(compress)'a' else 'b' 若compress为真输出a 否则输出b
if(compress) ' ' else 'b' 若compress为真输出 Any = ()
if表达式后面若存在else则if后面必须有表达式
var x = List('s','b') 定义list
for(y <- x if(y != null))print(y)
var p = for(y <- x if(y != null))yield(y) yield表示将数据y赋值给p 由于y是list中的数据,所以 p也会被声明为了list
“<-”是用来遍历list中的元素的
5.try catch finally match
try{
var x = 1 / 0
} catch{
case _ => 's'
}finally{
print("ss")
}
var x = 5
x match = {
case 1 => 1
case 2 => 2
case _ => 4
}
6.scala的求值策略(传参方式)
(1)call by name 不会对表达式求值,直接带入函数体
(2)call by value 对表达式求值得到结果后,才代入函数体
def x(a:Int,b:Int) = a * a 属于call by value
def z(a :=>Int,b: => Int) = a * a 属于call by name
def y():Int = y;
x(y,3)会造成死循环,因为会先对y表达式求值,而y表达式是一个死循环的表达式
7.匿名函数
匿名函数的定义:(参数列表)=> {函数体}
scala里函数体可以作为一切参数
8集合
scala集合的种类有set map seq
声明list:var x = List(1,2,3)
var x = a :: b :: v :: Nil可以使用 :: 来做元素的连接操作
方法:x.head 返回1
xtail 返回 2,3
x.isEmpty 返回一个boolean值
可以使用:::将多个集合链接起来
高级应用:
x.filter(匿名函数) filter将会过滤符合匿名函数条件的元素
"sdfsdf dfs".toList.filter(x => Character.isDigit(x)) 将字符串转换为字符列表,并过滤出是数字的字符
"sdfsdf dfs".toList.takeWhile(x => x != 'd') 当满足takeWhile表达式就终止过滤
var tt = "s"::"zz"::Nil tt.map(x => x.toUpperCase) 将会把tt中的元素变为大写,tt需要是一个String类型的列表
var a = List(1,2,3) a.reduceLeft((x,y) => x + y) 将a中的元素计算为最终的一个元素
var s = List(1,2,3).toStream 使用toStream可以使得元素lazy化,在使用的时候在去计算
1#::2#::Stream.Empty 惰性列表的另外一种声明方式
1 to 10 会声明一个1到10的列表
1 to 10 by 2 会声明一个1到10的列表 但是步长为2
1until 10 10是开区间
var c = Map('s' -> 3) 声明一个map
c('s') 取出key为字符s的value值
c + ('d' -> 5)会给map集合中添加一个k,v
c ++ List('f' -> 33) 会加入多个
c.contains(key) 判断是否包含某个key
c.keys 返回所有的key
移除可以使用 - 号或者 --号