3

Scala にはList、オプションの がありますOption。これは、たとえば、でfor内包表記を使用しList、yield が を返す場合に発生しますOption。私の場合、JSON オブジェクトを処理し、forフィールドのリスト ( List[JField]) で内包表記を使用していました。

リストを開いて と にマップする最良の方法は何List()ですか?NoneList(Some(a))Some(a)

最初のアプローチは

def headOrNone[A](list:List[Option[A]]) = 
    list match {
        case Nil => None
        case a::Nil => a
    }

別のアプローチ

def headOrNone[A](list:List[Option[A]]) = list.headOption.getOrElse(None)

3 番目のアプローチ (headOption 実装のバリエーション)

def headOrNone[A](list:List[Option[A]]) = if (list.isEmpty) None else list.head

私は個人的には 3 番目のアプローチを好みます。この関数のより良い名前はありheadOrNoneますか? また、それを書くための慣用的なスカラの方法は何ですか?

4

2 に答える 2

6

あなたはおそらく作成されるべきではなかった問題を解決しています。代わりに、あなたはおそらくしたい

for (x <- list) yield f(x)  // Yields Option

することが

list.flatMap(f)

次に、リストに最初に0個または1個の項目が含まれます(これはを使用して抽出できますheadOption)。

于 2012-09-16T18:28:44.043 に答える
5

これはどう:

def headOrNone[A](list: List[Option[A]]) = list.flatten.headOption

headOrNone(List(Some(4)))   // Some(4)
headOrNone(List())          // None

最初の選択肢には、たまたま複数のアイテムを含むリストがある場合にエラーが発生するという利点がありますが、説明によると、これはエラー状態のようです。

しかし、個人的には、 を生成するコードを再評価し、List[Option[A]]そもそも正しいものを返す方法があるかどうかを確認します!

于 2012-09-16T15:45:37.067 に答える