在Scala中,仅当存在可选值时才将项目添加到Map

Cus*_*Bun 2 scala optional

我是scala的新手,我正在尝试以一种干净的方式做这样的事情。

我有一个采用几个可选参数的方法。我想创建一个地图,并且仅在可选参数具有值的情况下才向地图添加项目。这是一个虚拟的例子:

def makeSomething(value1: Option[String], value2: Option[String], value3: Option[String]): SomeClass = {
  val someMap: Map[String, String] = 
     value1.map(i => Map("KEY_1_NAME" -> i.toString)).getOrElse(Map())
}
Run Code Online (Sandbox Code Playgroud)

在上面的这种情况下,我们正在做我想做的事情,但是只有当我们只关心value1时,我才希望对所有可选值都做到这一点,并将它们放入地图中。我知道我可以做一些蛮力的事情:

def makeSomething(value1: Option[String], value2: Option[String], value3: Option[String]): SomeClass = {
  // create Map
  // if value1 has a value, add to map
  // if value2 has a value, add to map 
  // ... etc
}
Run Code Online (Sandbox Code Playgroud)

但是我想知道scala是否有任何功能可以帮助我解决此问题。

提前致谢!

Tza*_*har 5

您可以创建一个Map[String, Option[String]],然后使用collect删除空值并从其包装中“提取”当前值Option

def makeSomething(value1: Option[String], value2: Option[String], value3: Option[String]): SomeClass = {
  val someMap: Map[String, String] = 
    Map("KEY1" -> value1, "KEY2" -> value2, "KEY3" -> value3)
     .collect { case (key, Some(value)) => key -> value }

  // ...
}
Run Code Online (Sandbox Code Playgroud)