0

Some(List("hello"))を取得したい"hello"場合、次の動作を観察しました。

scala> val list = Some(List("hello"))
list: Some[List[String]] = Some(List(hello))

scala> list.head.head
res3: String = hello

次に、Scaladocsを確認したところ、コレクションが空の場合に例外がスローさheadれるSelect the first element of this iterable collection.ことも指摘されています。

この Option[List] の最初の要素の取得は、慣用的と見なされますか?

4

4 に答える 4

5

それは慣用的ではありませが、私は好む傾向があります:

scala> val hd = list.flatMap(_.headOption)
hd: Option[String] = Some(hello)

そして、オプション値で作業を続けます。

于 2013-09-11T02:32:33.593 に答える
4

答えは、その値で次に何をしたいかによって異なります。たとえば、@Shadowlands が提案したものを使用して、 and を使用して作業を続けることができOptionます。他にできることは、パターン マッチングを使用することです。mapflatMap

list match {
  case Some(head :: tail) => soSomethingWith(head)
  case Some(Nil) => dealWithEmptyList
  case None => dealWithNone
}
于 2013-09-11T02:41:42.767 に答える
0

また、必要に応じて for-comprehension を使用して head オプションを取得することもできます。もう少し簡潔なので、おそらく@Shadowlandsの回答を好むでしょうが、これも同様に機能します:

val headOpt = 
  for{
    list <- listOpt
    head <- list.headOption
  } yield head 
于 2013-09-11T10:43:11.407 に答える
0

あなたの表現は慣用句ではありません。Somenull 値の可能性を処理する Scala の方法です。a の概念はSome、頭だけがあり、尾がないリストとして説明できますが、慣用的な使用法としてではなく、比喩としてのみ説明できます。あなたが実際に表現しているのは、ネストされたリストです:

val list: List[List[String]] = List(List("hello"))

listただし、空でないリストである値を持つ100% の確実性がある場合は、次のようにします。

list match { case Some(xs) => xs.head }
于 2013-09-11T05:37:47.973 に答える