本站内容版权属于本人。转载须告知本人,写明出处,并在文首提供指向本站对应文章的链接。
本文链接:Scala学习(十一)——lambda表达式
本文链接:Scala学习(十一)——lambda表达式
简介
lambda表达式是现在非常流行的一种编程特性,其体现了函数式编程的思想。lambda表达式,顾名思义,是一种表达式。和其他表达式不同的地方在于,其返回的是一个函数对象而不是一个数。
基本用法
回顾Scala学习四的“方法”一节,方法的类型同样适合于lambda表达式的类型。而lambda表达式的定义方式和其类型的定义方式比较类似,是参数名列表,=>
,函数体:
1 2 3 4 |
def method(cb: (Int) => Int): Unit = for (i <- 1 to 10) println(cb(i)) method((x) => { x * 2 }) |
之前说过,大括号在只有一个语句时可以省略:
1 2 3 4 |
def method(cb: (Int) => Int): Unit = for (i <- 1 to 10) println(cb(i)) method((x) => x * 2) |
当然,如果只有一个参数的话,参数列表的括号也可以去掉:
1 2 3 4 |
def method(cb: Int => Int): Unit = for (i <- 1 to 10) println(cb(i)) method(x => x * 2) |
变型
在一些情况下,可以用_
来定义一个lambda表达式,比如上例可写成:
1 2 3 4 |
def method(cb: Int => Int): Unit = for (i <- 1 to 10) println(cb(i)) method(_ * 2) // 参数列表隐藏,用_代替参数名 |
在多参数清况下也可以使用_
,其用法是:第一个_
代替第一个参数,第二个_
代替第二个参数,依此类推。见下例:
1 2 3 4 5 |
def method(cb: (Int, Int) => Int): Unit = for (i <- 1 to 10) println(cb(i, i * 2)) method(_ + _) method((x, y) => x + y) // 等价 |
闭包
类似Java中匿名类的特点,Scala中方法内定义的函数或是lambda表达式中可以用到本方法的局部变量,这一性质称作闭包。Scala中闭包的功能更完善,可以做到类似Javascript的程度:
1 2 3 4 5 6 7 8 9 10 11 12 |
def counter(start: Int = 0): () => Int = { var i = start () => { i += 1 i } } val c = counter(1) println(c()) // 2 println(c()) // 3 println(c()) // 4 |
这里只是举个例子,实际中不一定会这么实现。
总结
其实lambda表达式说白了就是一个定义函数的方式,其优势在于简洁。至于什么地方会用到,且看之后的章节。