scala 下划线 是每个学习这门语言的童鞋必不能错过的知识点。Scala单作为一门语言来看, 非常的简洁高效,在Scala中存在很多让代码更加简洁的语法,下划线“_”便是其中一个。
- 作为“通配符”,类似Java中的*。如import scala.math._
- :_*([[冒号下划线星]])作为一个整体,告诉编译器你希望将某个参数当作参数序列处理!例如val s = sum(1 to 5:_*)就是将1 to 5当作参数序列处理。
- 指代一个集合中的每个元素。a.filter(_%2\==0).map(2*),表示Array a中筛出偶数,并乘以2;如要对缓冲数组ArrayBuffer b排序 val bSorted = b.sorted()
- 在元组中,可以用方法_1, _2, _3访问组员。如a._2。其中句点可以用空格替代
val t = (1, 2, 3) println(t._1, t._2, t._3)
- 使用模式匹配可以用来获取元组的组员
// 比如上一例中val (first, second, _) = t val (first, second, third) = t
- 划线_代表的是某一类型的默认值
//String类型的默认值为null var s: String = _ //Double类型的默认值是 0.0 var a: Double = _
- 匹配集合元素, [[下划线星]]表示变长参数队列
//匹配以0开头,长度为三的列表 expr match { case List(0, _, _) => println("found it") case _ => } //匹配以0开头,长度任意的列表 expr match { case List(0, _*) => println("found it") case _ => } //匹配元组元素 expr match { case (0, _) => println("found it") case _ => } //将首元素赋值给head变量 val List(head, _*) = List("a") // 默认匹配 str match{ case "1" => println("match 1") case _ => println("match default") }
-
[[function literal]]简写函数字面
数的参数在函数体内只出现一次,则可以使用下划线代替
val f1 = (_: Int) + (_: Int) //等价于 val f2 = (x: Int, y: Int) => x + y list.foreach(println(_)) //等价于 list.foreach(e => println(e)) list.filter(_ > 0) //等价于 list.filter(x => x > 0)
-
定义一元操作符
Scala中,操作符其实就是方法,例如1 + 1等价于1.+(1);利用下划线我们可以定义自己的左置操作符
-2 //等价于 2.unary_-
-
定义赋值操作符
通过下划线实现赋值操作符
class Foo { def name = { "foo" } def name_=(str: String) { println("set name " + str) } val m = new Foo() m.name = "Foo" //等价于: m.name_=("Foo")
-
[[partially applied function]] 定义部分应用函数
可以为某个函数只提供部分参数进行调用,返回的结果是一个新的函数,即部分应用函数
def sum(a: Int, b: Int, c: Int) = a + b + c val b = sum(1, _: Int, 3) b: Int => Int = <function1> b(2) //6
-
将方法转换成函数
Scala中方法和函数是两个不同的概念,方法无法作为参数进行传递,也无法赋值给变量,但是函数是可以的, 在Scala中,利用下划线可以将方法转换成函数
//将println方法转换成函数,并赋值给p val p = println _ //p: (Any) => Unit