检索选项头[列表[...]]

时间:2013-09-11 02:29:18

标签: scala

鉴于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并看到headSelect the first element of this iterable collection.它还指出如果集合为空则会抛出异常。

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

4 个答案:

答案 0 :(得分:5)

这不是不是惯用语,但我更倾向于选择:

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

继续使用Option值。

答案 1 :(得分:4)

答案实际上取决于您想要使用该值做什么。例如,您可以使用@Shadowlands提出的内容,并使用Optionmap继续使用flatMap。您可以做的另一件事是使用模式匹配:

list match {
  case Some(head :: tail) => soSomethingWith(head)
  case Some(Nil) => dealWithEmptyList
  case None => dealWithNone
}

答案 2 :(得分:0)

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

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

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

list match { case Some(xs) => xs.head }

答案 3 :(得分:0)

如果您愿意,也可以使用for-comprehension来获取头部选项。我可能更喜欢@Shadowlands的回答,因为它有点简洁,但这也会有效:

val headOpt = 
  for{
    list <- listOpt
    head <- list.headOption
  } yield head