0

给定 aSome(List("hello"))并想要得到"hello",我观察到以下行为。

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

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

然后,我检查了Scaladocs并看到了它还指出,如果集合为空,则会引发异常headSelect the first element of this iterable collection.

检索 Option[List] 的第一个元素是否被认为是惯用的?

4

4 回答 4

5

不是惯用的,但我更倾向于:

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

并继续使用 Option 值。

于 2013-09-11T02:32:33.593 回答
4

答案实际上取决于您接下来要使用该值做什么。例如,您可以使用 @Shadowlands 建议的内容并继续Option使用 usingmapflatMap. 您可以做的另一件事是使用模式匹配:

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

你的表达不是惯用的。Some是 Scala 处理空值可能性的一种方式。可以将 a 的概念解释Some为只有头没有尾的列表,但只能作为隐喻而不是惯用用法。你真正表达的是一个嵌套列表:

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

但是,如果您 100% 确定list有一个值,即非空列表,那么我会这样做:

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

如果你愿意的话,你也可以使用理解来获得头部选项。我可能更喜欢@Shadowlands 的回答,因为它更简洁一些,但这也可以:

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