答案 0 :(得分:24)
map
:允许您将Option
内部的值转换为List
,您可能已经知道Option
。此操作使flatMap
成为一个仿函数(如果你想吓唬你的同事,可以说“endofunctor”)Option
:flatMap
实际上是一个monad,而Option
使它成为一个(与单个值的构造函数一起)。如果您有一个将值转换为Option
的函数,则可以使用此方法,但您拥有的值已经“包裹”在flatMap
中,因此Option[Map[K,V]]
可以节省您的展开时间在应用该功能之前。例如。如果您有mapOption.flatMap(_.get(key))
,则可以写map
。如果您在此处使用简单的Option[Option[V]]
,则会获得flatMap
,但Option[V]
会获得flatten
。这种方法比你想象的要凉爽,因为它允许以非常灵活的方式将函数链接在一起(这就是为什么Haskell 喜欢 monad)的原因之一。Option[Option[T]]
:如果您的值为flatten
,则Option[T]
会将其转换为flatMap(identity(_))
。它与orElse
相同。Option
:如果您在orElse
中包含多个替代项,并且您希望第一个实际上包含值,则可以使用steakOption.orElse(hamburgerOption).orElse(saladOption)
链接这些替代项:{{1 }} getOrElse
:从Option
中获取值,但如果为空,则指定默认值,例如nameOption.getOrElse("unknown")
。 foreach
:对内部的值执行某些操作(如果存在)。isDefined
,isEmpty
:确定此Option
是否包含值。forall
,exists
:测试给定谓词是否适用于该值。 forall
与option.map(test(_)).getOrElse(true)
相同,exists
相同,默认为false
。toList
:很惊讶,它将Option
转换为List
。 答案 1 :(得分:10)
关于Option的许多方法可能更多是为了统一(使用集合)而不是为了它们的实用性,因为它们都是非常小的功能,因此不需要花费太多精力,但它们有助于实现目的,并且一旦熟悉了集合框架,它们的含义就很清楚了(正如人们常说的那样,Option就像一个不能有多个元素的列表)。
forall检查选项内值的属性。如果没有值,则检查通过。例如,如果在汽车租赁中,您可以使用additionalDriver: Option[Person]
,则可以执行
additionalDriver.forall(_.hasDrivingLicense)
如果允许使用其他几个驱动程序并且你有一个列表,那么你会做同样的事情。
toList可能是一个有用的转换。假设您有选项:List [Option [T]],并且您希望获得List [T],其中包含所有选项的值。你可以做到
for(option <- options; value in option.toList) yield value
(或更好options.flatMap(_.toList)
)
答案 2 :(得分:6)
我有toList
方法的一个实际例子。你可以在scaldi(我的Scala依赖注入框架)的Module.scala第72行找到它:
在此上下文中,getBindings
方法只能返回一个元素Nil
或List
。我可以使用Option
将其检索为discoverBinding
。我发现使用Option
方法将List
转换为toList
(空的或有一个元素)很方便。