已复制
全屏展示
复制代码

Scala 中下划线用法总结


· 3 min read

一. 导入通配符

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

import java.util._

二. 类成员默认值

Java中类成员可以不赋初始值,编译器会自动帮你设置一个合适的初始值,而在Scala中必须要显式指定,可以用 _ 让编译器自动帮你设置初始值,注意: 该语法只适用于类成员,而不适用于局部变量。

class Foo{
    //String类型的默认值为null
    var s: String = _
}

三. 可变参数

当传入的参数已经是一个Array或者List时,需要使用 _* 告诉函数作为一个整体传入的。

// 定义一个可变参数的函数
def echo(args: String*) = for (arg <- args) println(arg)

// 调用方法一
echo("a", "b", "c")

// 调用方法二
val d = List("a", "b", "c")
echo(d: _*)

四. 类型通配符

下划线表示任意的类型,printList可以打印任意类型的List。

def printList(list: List[_]): Unit ={
   list.foreach(elem => println(elem + " "))
}

scala> printList(List(3))
3 

scala> printList(List("3"))
3 

五. 模式匹配之默认匹配

val str = "9"
str match{
    case "1" => println("match 1")
    case _   => println("match default")
}

六. 模式匹配之集合元素匹配

//匹配以0开头,长度为三的列表
expr match {
  case List(0, _, _) => println("found it")
  case _ =>
}

//匹配以0开头,长度任意的列表
expr match {
  case List(0, _*) => println("found it")
  case _ =>
}

//将首元素赋值给head变量,head是一个新的变量
val List(head, _*) = List("a")

七. 访问Tuple元素

val t = (1, 2, 3)
println(t._1, t._2, t._3)

八. 简写函数字面量

如果函数的参数在函数体内只出现一次,则可以使用下划线代替

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),利用下划线我们可以定义自己的左置操作符,例如Scala中的负数就是用左置操作符实现的

-2
// 等价于
2.unary_-

十. 私有成员setter方法

类Student中的_score是私有成员,score方法是getter方法,score_是setter方法,注意: score_= 是连在一块的,没有空格。

class Student {
  private var _score = 0

  def score = _score
  def score_= (newScore: Int): Unit = {
    if (newScore > 0) _score = newScore else println("value error!")
  }
}

val s = new Student
s.score = -1
s.score = 90

十一. 定义部分应用函数

我们可以为某个函数只提供部分参数进行调用,返回的结果是一个新的函数,即部分应用函数。因为只提供了部分参数,所以部分应用函数也因此而得名。

def sum(a: Int, b: Int, c: Int) = a + b + c

// 固定两个参数
val new1 = sum(1, _: Int, 3)
scala> new1(4)
res41: Int = 8

// 所有参数均未固定
val new2 = sum _
scala> new2(3,4,5)
res42: Int = 12

参考资料

🔗

文章推荐