字面量
字面量:直接在源代码里书写的‘值’,例如:
- 整数字面量:10,34L
- 浮点数字面量:3.14, 4.56F
- 布尔型字面量:false, true
- 字符串字面量:“hello world”
- 字符字面量:‘A’, ‘\u0045’, ‘’’(转义)
变量
scala声明一个变量的基本语法:
val 变量名:变量类型 = 初始值
var 变量名:变量类型 = 初始值初始值可以是字面量或变量名
函数
scala中,函数成为了和普通的变量一样的‘头等公民’,可以像其他任何数据类型的值一样的被传递和操作。
函数的值也叫做函数的字面量。整数字面量就是一个整数,类推即:函数字面量就是一个函数。
# 可以在整数字面量中指出变量类型,同理可以在函数字面量中指出参数类型,即匿名函数
scala> val a = 10L
a: Long = 10
scala> val a:Long = 10
a: Long = 10
scala> val a:Int = 10L
^
error: type mismatch;
found : Long(10L)
required: Int
类或者单例对象中的成员函数叫做方法,其定义的基本语法为:
def 方法名(函数列表): 返回结果类型 = {方法体}
函数既然作为‘头等公民’,也要有“类型” 和 “值” 的区分。
函数类型需要明确函数接受多少个参数,每个参数的类型以及函数返回结果的类型;值则是一个函数的具体实现(变量列表=> 映射关系/运算语句)。例如:
声明函数的语法和声明变量语法相同:
val 函数名:函数类型 = 函数值
函数值的基本语法(当只有一个参数时,可以省略圆括号(), 当映射关系(或叫做运算语句)只有一条语句时,可以省略大括号{}:
(参数列表)=> {映射关系}
scala> val fun:(Int, Int) => Int = (x, y) => {val z = x*2; z+y }
fun: (Int, Int) => Int = $$Lambda$892/1107130176@35e50381
scala> fun(3,4)
res15: Int = 10
匿名函数
匿名函数(Lambda表达式):给出了函数参数类型的函数字面量。
因为匿名函数中给出了函数的参数类型,并且scala有类型推断系统,所以定义函数变量时如果函数字面量写成匿名函数形式,便可以省略“函数类型”。
占位符函数
如果函数的每个参数在函数映射/运算语句中仅出现一次,可以省略"=>"并用下划线作为参数的占位符来简化函数字面量的表示,第一个下划线代表第一个参数,第二个下划线代表第二个参数,以此类推。例如:
# 函数的普通语法
scala> val add:(Int, Int)=>Int = (x,y)=>x+y
add: (Int, Int) => Int = $$Lambda$893/1671201590@2d617d27
scala> add(2,3)
res16: Int = 5
# 匿名函数语法
scala> val add = (x:Int,y:Int)=>x+y
add: (Int, Int) => Int = $$Lambda$894/1578614193@231e72e1
scala> add(2,3)
res17: Int = 5
# 占位符语法
scala> val add:(Int, Int)=>Int = _ + _ # 看到形如 ‘_*2’ 的表达式时,要知道是一个函数字面量。
add: (Int, Int) => Int = $$Lambda$901/102034667@551d933f
scala> add(2,3)
res19: Int = 5
scala> val add = (_:Int) + (_:Int) #有类型时括号不能省略
add: (Int, Int) => Int = $$Lambda$900/1593829543@2aeaa332
scala> add(2,3)
res18: Int = 5