16

我有可以返回空值的函数:

def func(arg: AnyRef): String = {
...
}

我想将结果添加到列表中,如果它不为空:

...
val l = func(o)
if (l != null)
  list :+= l
....

或者

def func(arg: AnyRef): Option[String] = {
...
}
...
func(o).filter(_ != null).map(f => list :+= f)
...

但是看起来太重了。

有没有更好的解决方案?

4

2 回答 2

33

您可以简单地将选项附加到列表中。这是因为由于隐式转换, anOption可以被视为Iterable(空的None,只有一个元素) 。SomeOption.option2Iterable

因此,对于选项变体(第二版func),只需执行以下操作:

list ++= func(o)

对于另一个变体(的第一个版本),您可以首先使用(将转换为或用 包装该值)func将返回值转换为func选项,然后像上面那样做。这使:Option.applynullNoneSome

list ++= Option(func(o))
于 2013-01-21T12:11:24.277 回答
0

首先,您应该指出该函数可能/可能不会返回一个值,其中返回值被包装SomeNone返回

def func(arg: AnyRef): Option[String] = {
    //  ...
    Some(value) orElse None
}

使用来自 func(0) 的列表,该列表val list = func(0) collect {case Some(x) => x}仅采用使用 collect 定义的值。

于 2013-01-21T12:41:01.530 回答