打开包含0或1个选项的列表的最佳方法是什么?

时间:2012-09-16 15:43:19

标签: scala

在Scala中,我有List个可选Option。例如,当您对for使用List理解并且您的收益率返回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方法是什么?

2 个答案:

答案 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]]的代码,看看是否有办法让它首先返回正确的东西!