Scala 下划线 介绍

scala 下划线 是每个学习这门语言的童鞋必不能错过的知识点。Scala单作为一门语言来看, 非常的简洁高效,在Scala中存在很多让代码更加简洁的语法,下划线“_”便是其中一个。

  1. 作为“通配符”,类似Java中的*。如import scala.math._
  2. :_*([[冒号下划线星]])作为一个整体,告诉编译器你希望将某个参数当作参数序列处理!例如val s = sum(1 to 5:_*)就是将1 to 5当作参数序列处理。
  3. 指代一个集合中的每个元素。a.filter(_%2\==0).map(2*),表示Array a中筛出偶数,并乘以2;如要对缓冲数组ArrayBuffer b排序 val bSorted = b.sorted()
  4. 在元组中,可以用方法_1, _2, _3访问组员。如a._2。其中句点可以用空格替代
    val t = (1, 2, 3) 
    println(t._1, t._2, t._3)
  5. 使用模式匹配可以用来获取元组的组员
    // 比如上一例中val (first, second, _) = t
    val (first, second, third) = t
  6. 划线_代表的是某一类型的默认值
    //String类型的默认值为null 
    var s: String = _
    //Double类型的默认值是 0.0
    var a: Double = _
  7. 匹配集合元素, [[下划线星]]表示变长参数队列
    //匹配以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") 
    }
  8. [[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)
  9. 定义一元操作符

    Scala中,操作符其实就是方法,例如1 + 1等价于1.+(1);利用下划线我们可以定义自己的左置操作符

    -2 
    //等价于 
    2.unary_-
  10. 定义赋值操作符

    通过下划线实现赋值操作符

    class Foo { 
    def name = { "foo" } 
    def name_=(str: String) { 
        println("set name " + str) 
    } 
    val m = new Foo()
    m.name = "Foo" 
    //等价于: 
    m.name_=("Foo")
  11. [[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
  12. 将方法转换成函数

    Scala中方法和函数是两个不同的概念,方法无法作为参数进行传递,也无法赋值给变量,但是函数是可以的, 在Scala中,利用下划线可以将方法转换成函数

    //将println方法转换成函数,并赋值给p 
    val p = println _ 
    //p: (Any) => Unit

发表回复