定义函数最通用的方法是作为某个类或者单例对象的成员,这种函数被称为方法。
基本定义语法:
def 方法名 (参数列表) : 结果类型 = {方法体}
def max(x: Int, y: Int): Int = {
if (x > y) x
else y
}
函数概念:
def counter(value: Int): Int = {value += 1}
函数类型:(Int) => Int
函数的输入参数的类型以及返回值的类型一起构成函数类型。
函数值:(value) => {value += 1}
定义函数:
val counter:Int => Int = {(value) => value += 1}
函数字面量
匿名函数,Lambda表达式,不需要给每个函数命名。
(num:Int) => num * 2
Lambda表达式格式:
(参数)=>表达式
//如果参数只有一个,参数的圆括号可以省略
案例:
scala> val myNumFunc:Int=>Int = (num:Int)=>num * 2
myNumFunc: Int => Int = $Lambda$1041/1258503852@51a16adf
scala> println(myNumFunc(3))
6
匿名函数→赋值→函数类型的变量
当Scala可以自动推断变量类型时,不用声明类型。
scala> val myNumFunc = (num:Int)=>num * 2
myNumFunc: Int => Int = $Lambda$1057/227972178@4d4df0f4
scala> println(myNumFunc(3))
6
若继续省略num的类型声明
scala> val myNumFunc = (num)=>num * 2
<console>:11: error: missing parameter type
val myNumFunc = (num)=>num * 2
^
若给出类型说明
scala> val myNumFunc:Int=>Int = (num)=>num * 2
myNumFunc: Int => Int = $Lambda$1067/1482010861@92fd091
scala> println(myNumFunc(3))
6
下划线“_”的作用:
表示每个参数在函数字面量里面仅出现一次。
scala> val counter = (_:Int)+1//有类型时括号不能省略,等效于“x:Int=>x+1”
counter: Int => Int = $Lambda$1068/519063059@2d3d4a54
scala> val add = (_:Int)+(_:Int)//等效于“(a:Int,b:Int)=>a+b”
add: (Int, Int) => Int = $Lambda$1070/1221878991@1e14b269
scala> val m1=List(1,2,3)
m1: List[Int] = List(1, 2, 3)
scala> val m2=m1.map(_*2)//map接受一个函数作为参数,相当于“m1.map(x=>x*2)”,参数的类型可以根据m1的元素类型推断出,所以可以省略。
m2: List[Int] = List(2, 4, 6)