2013-06-25 30 views
0

有没有更好的方式在scala中编写它?如何以更清晰的方式用Scala中的选项重写此条件?

def myFunction(somethingA: String, somethingB: Option[String]): Unit = 
    if (somethingB.isDefined) 
    foo("somethingA" -> somethingA, "somethingB" -> somethingB.get) 
    else 
    foo("somethingA" -> somethingA) 

我想沿着线的东西:

def myFunction(somethingA: String, somethingB: Option[String]): Unit = 
    foo("somethingA" -> somethingA, somethingB.map("somethingB" -> _).getOrElse(.... pleh ....)) 

但是即使我更换“...... pleh ......”有某种表达的一部分,我不如果没有定义somethingB,它甚至不希望它添加映射。所以我不认为这是远程工作。不知道什么是正确的解决方案。

回答

2

不干净多了:

def myFunction(somethingA: String, somethingB: Option[String]): Unit = somethingB match { 
    case Some(b) => foo("somethingA" -> somethingA, "somethingB" -> b) 
    case None => foo("somethingA" -> somethingA) 
} 
+0

这就是我的想法。试图设想一些基于'flatMap'的选项,但不能解决这个问题。 +1 –

+0

是的,这是干净的,我猜。谢谢 – Donuts

0

我的2美分:

val a = "somethingA" -> somethingA 

somethingB.map{ b => 
    foo(a, "somethingB" -> b) 
}.getOrElse { foo(a) } 

几乎更具可读性。顺便说一句。我不认为你可以结合取决于值:(

1

您也可以尝试折叠Option如果你使用Scala的2.10更改来电:

val result = somethingB.fold(foo("somethingA" -> somethingA))(b => foo("somethingA" -> somethingA, "somethingB" -> b)) 
2

你不说什么foo是,但鉴于

scala> def foo(ps: (String, String)*) = ps.size 
foo: (ps: (String, String)*)Int 

然后

scala> def myFunction(somethingA: String, somethingB: Option[String]): Int = 
    | foo(List(Some("A"->somethingA), somethingB.map("B"->_)).flatten: _*) 
myFunction: (somethingA: String, somethingB: Option[String])Int 

可能是什么ÿ你打算。

相关问题