当前位置: 代码迷 >> 综合 >> Scala 中下划线的常见使用
  详细解决方案

Scala 中下划线的常见使用

热度:88   发布时间:2024-02-21 02:14:19.0

很多程序员在读别人的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: _*)