Scala 中下划线用法总结
一. 导入通配符
*号在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
参考资料