如果value不为null,则添加到列表

时间:2013-01-21 11:51:45

标签: scala functional-programming monads

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

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

我希望将结果添加到列表中,如果它不是null:

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

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

但它看起来太重了。

有没有更好的解决方案?

2 个答案:

答案 0 :(得分:33)

您只需将该选项附加到列表即可。这是因为Option可以被视为IterableNone为空,Some只有一个元素),这要归功于隐式转化Option.option2Iterable

因此对于选项变体(func的第二个版本),只需执行:

list ++= func(o)

对于其他变体(func的第一个版本),您可以先使用funcOption.apply的返回值转换为选项(将null转换为{{ 1}}或者用None包裹值,然后像上面那样。这给出了:

Some

答案 1 :(得分:0)

首先,您应该指出该函数可能/可能不会返回返回值包含在SomeNone中的值

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

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