3

在 Scala 中,我有List一个可选的Option. 例如,当您for对 a 使用理解List并且您的 yield 返回a 时,就会出现这种情况Option。在我的例子中,我正在处理一个 JSON 对象并for在字段列表 ( List[JField]) 上使用理解。

打开列表并映射List()NoneList(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 的惯用方法是什么?

4

2 回答 2

6

您正在解决一个可能不应该被创建的问题。相反,您可能想要

for (x <- list) yield f(x)  // Yields Option

成为

list.flatMap(f)

然后您的列表中将有零或一件事开始(您可以使用 提取headOption)。

于 2012-09-16T18:28:44.043 回答
5

这个怎么样:

def headOrNone[A](list: List[Option[A]]) = list.flatten.headOption

headOrNone(List(Some(4)))   // Some(4)
headOrNone(List())          // None

尽管如果您碰巧有一个包含多个项目的列表,则第一个选择的优点是会给您一个错误,根据您的描述,这似乎是一个错误条件。

但就个人而言,我会重新评估产生的代码,List[Option[A]]看看是否有办法让它首先返回正确的东西!

于 2012-09-16T15:45:37.067 回答