美文网首页
Scala中下划线的使用

Scala中下划线的使用

作者: 陈昭衍 | 来源:发表于2019-01-08 10:36 被阅读0次

          下划线在Scala中有很多特殊用法,能清楚了解各个地方下划线代表含义可以反应Scala语言的熟练程度,一般面试过程中可能会问到,你知道Scala中下划线有哪些用法吗?下面,我们细聊下Scala中下划线的使用:

    1. 用于替换Java的等价语法

    由于大部分的Java关键字在Scala中拥有了新的含义,所以一些基本的语法在Scala中稍有变化。

           1.1 导入通配符

    *在Scala中是合法的方法名,所以导入包时要使用_代替。

    //Java

    import java.util.*;

    //Scala

    import java.util._

          1.2 类成员默认值

    Java中类成员可以不赋初始值,编译器会自动帮你设置一个合适的初始值:

    classFoo{

           //String类型的默认值为null

           String s;

    }

    而在Scala中必须要显式指定,如果你比较懒,可以用_让编译器自动帮你设置初始值:

    classFoo{

            //String类型的默认值为null

            var s:String = _

    }

            1.3 可变参数

    Java声明可变参数如下:

    public static void printArgs(String ... args){

        for(Object elem: args){

            System.out.println(elem +" ");

        }

    }

    调用方法如下:

    //传入两个参数

    printArgs("a","b");

    //也可以传入一个数组

    printArgs(newString[]{"a","b"});

    在Java中可以直接将数组传给printArgs方法,但是在Scala中,你必须要明确的告诉编译器,你是想将集合作为一个独立的参数传进去,还是想将集合的元素传进去。如果是后者则要借助下划线:

    printArgs(List("a","b"): _*)

             1.4 类型通配符

    Java的泛型系统有一个通配符类型,例如List<?>,任意的List<T>类型都是List<?>的子类型,如果我们想编写一个可以打印所有List类型元素的方法,可以如下声明:

    public static void printList(Listlist){

        for(Object elem:list){

            System.out.println(elem +" ");

        }

    }

    对应的Scala版本为:

    def printList(list: List[_]): Unit ={

      list.foreach(elem => println(elem +" "))

    }

    2 模式匹配

             2.1 默认匹配

    str match{

        case"1" => println("match 1")

        case _ => println("match default")

    }

            2.2 匹配集合元素

    //匹配以0开头,长度为三的列表

    expr match {

        caseList(0, _, _) => println("found it")

        case _ =>

    }

    //匹配以0开头,长度任意的列表

    expr match {

        caseList(0, _*) => println("found it")

        case _ =>

    }

    //匹配元组元素

    expr match {

        case (0, _) => println("found it")

        case _ =>

    }

    //将首元素赋值给head变量

    val List(head, _*) =List("a")

    3. Scala特有语法

             3.1 访问Tuple元素

    valt = (1,2,3)

    println(t._1,t._2,t._3)

            3.2 简写函数字面量(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)

             3.3 定义一元操作符

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

    -2//等价于

    2.unary_-

           3.4 定义赋值操作符

    我们通过下划线实现赋值操作符,从而可以精确地控制赋值过程:

    class Foo{

        defname= {"foo" 

    }

    def name_=(str:String) {

         println("set name " + str)  

    }

    val m =newFoo()    

    m.name ="Foo"//等价于: m.name_=("Foo")

               3.5 定义部分应用函数(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

              3.6 将方法转换成函数

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

    //将println方法转换成函数,并赋值给p

    val p = println _

    //p: (Any) => Unit

    4. 小结

    下划线在大部分的应用场景中是以语法糖的形式出现的,可以减少击键次数,并且代码显得更加简洁。

    相关文章

      网友评论

          本文标题:Scala中下划线的使用

          本文链接:https://www.haomeiwen.com/subject/fxxurqtx.html