在Scala中,我有List
个可选Option
。例如,当您对for
使用List
理解并且您的收益率返回Option
时会出现这种情况。就我而言,我正在处理一个JSON对象,并在字段列表for
)上使用List[JField]
理解。
打开列表并将List()
映射到None
和List(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)
第三种方法(headOption实施的变体)
def headOrNone[A](list:List[Option[A]]) = if (list.isEmpty) None else list.head
我个人更喜欢第三种方法。这个函数有一个比headOrNone
更好的名称吗?编写它的惯用scala方法是什么?
答案 0 :(得分:6)
您正在解决可能不应该创建的问题。相反,你可能想要
for (x <- list) yield f(x) // Yields Option
是
list.flatMap(f)
然后您的列表中将包含零个或一个内容(您可以使用headOption
提取)。
答案 1 :(得分:5)
这个怎么样:
def headOrNone[A](list: List[Option[A]]) = list.flatten.headOption
headOrNone(List(Some(4))) // Some(4)
headOrNone(List()) // None
虽然第一种选择的优势在于,如果您碰巧列出了多个项目的列表,根据您的描述,这似乎是一个错误条件。
但就个人而言,我会重新评估产生List[Option[A]]
的代码,看看是否有办法让它首先返回正确的东西!