很多程序员在读别人的Scala代码时会遇到很多下划线, 那么我们就来总结一下在Scala中下划线的7种常见用法:
1. 表示忽略
有时候一个变量的名字或者值并不重要或者并不会被使用,那么我们可以声明这个变量:
val _ = 100
不会以上这种情况还是挺少见的。 更多一些的使用情形:
val l = (1 to 10).map(_ => 100)
还有一种情形是在self-types中作为类型限制:
trait Engine
trait Motor { _: Engine// some implementation
}
实现Motor 时必须要先实现Engine。
最后, 在范型中也会使用到下划线。
def process(list: List[Option[_]]): Int = list.length
2. Wildcards
比如我们在进行import时, 想引入包中所有的类:
import cats.implicits._
还有一种使用方式就是在模式匹配中:以下表示匹配所有可能的结果
something match {case _ => "do something"
}
3. 默认初始值
当我们不知道一个变量的默认初始值时, 可以用下划线表示, 这样编译器会自动根据变量的类型给变量赋一个默认的初始值:
var myVar: String = _
4. Lambda 语法糖
// 一般写法
List(1,2,3,4).map(x => x * 5)// 使用下划线语法糖
List(1,2,3,4),map(_ * 5)// _+_ 和 (a,b) => a+b 是一样的
val sumFun: (Int,Int) => Int = _ + _
5. Eta-expansion
当我们需要将一个方法转化成一个函数时, 我们可以使用下划线:
def sum(x: Int, y: Int) = x + yval sumFun = sum _
此时编译器会创建一个新的lambda:(x,y) => sum(x,y)
6. Higher-Kinded Types
范型本身的类型参数就是一个范型
// H 也是一个范型
class HigherKindedType[H[_]]// 初始化 无需指定List[String] 或其他
val myOne = new HigherKindedType[List]
7. vararg method
当我们需要将一个集合传给一个带有可变参数的方法时
def myMethod(words: String*) = ???val words = List("this", "is", "so", "cool")
val res = myMethod(words: _*)