鉴于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]的第一个元素的检索是否被认为是惯用的?
答案 0 :(得分:5)
这不是不是惯用语,但我更倾向于选择:
scala> val hd = list.flatMap(_.headOption)
hd: Option[String] = Some(hello)
继续使用Option值。
答案 1 :(得分:4)
答案实际上取决于您想要使用该值做什么。例如,您可以使用@Shadowlands提出的内容,并使用Option
和map
继续使用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