Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Scala中,仅当存在可选值时才向映射添加项_Scala_Optional - Fatal编程技术网

在Scala中,仅当存在可选值时才向映射添加项

在Scala中,仅当存在可选值时才向映射添加项,scala,optional,Scala,Optional,我是scala的新手,我正在尝试以一种干净的方式做类似的事情 我有一个方法,它接受几个可选参数。我想创建一个映射,并且仅当可选参数有值时才向映射添加项目。下面是一个虚拟示例: def makeSomething(value1: Option[String], value2: Option[String], value3: Option[String]): SomeClass = { val someMap: Map[String, String] = value1.map(i =

我是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是否有任何功能可以帮助我清理这个问题


提前谢谢

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

  // ...
}

.collect
是一种可能性。或者,使用
选项
可以轻松转换为
序列

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