16

null値を返すことができる関数があります:

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)
...

でも見た目が重すぎる。

より良い解決策はありますか?

4

2 に答える 2

33

オプションをリストに追加するだけです。これは、暗黙的な変換のおかげで、 an を( の場合は空で、 の場合は 1 つの要素を持つ)Optionとして扱うことができるためです。IterableNoneSomeOption.option2Iterable

したがって、オプション バリアント (の 2 番目のバージョンfunc) の場合は、次のようにします。

list ++= func(o)

他のバリアント ( の最初のバージョンfunc) については、最初に の戻り値をfuncOption を使用して変換しOption.apply( に変換nullするNoneか、値を でラップしますSome)、次に上記のようにします。これにより、次のことが得られます。

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

最初に、戻り値がラップされているSomeNone返されている場合、関数が値を返す場合と返さない場合があることを示す必要があります。

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

val list = func(0) collect {case Some(x) => x}collect を使用して定義された値のみを取るfunc(0) からのリスト。

于 2013-01-21T12:41:01.530 に答える