在Scala中,如果存在可选值,则仅向Map添加项目

时间:2017-09-20 19:08:46

标签: 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())
}

在上面的这种情况下,我们正在做我想要的事情,但前提是我们只关心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
}

但我想知道scala是否有任何功能可以帮助我清理它。

提前致谢!

2 个答案:

答案 0 :(得分:4)

您可以创建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 }

  // ...
}

答案 1 :(得分:3)

.collect是一种可能性。或者,使用Option可轻松转换为Seq

的事实
 value1.map("KEY1" -> _) ++ 
 value2.map("KEY2" -> _) ++ 
 value3.map("KEY3" -> _) toMap