我在这里阅读了推荐我的博客文章。现在我想知道这些方法有什么用。你能举出使用(而不是)和的例子吗?forall
foreach
toList
Option
问问题
7032 次
3 回答
27
map
:允许您在“内部”转换值 anOption
,正如您可能已经知道的List
s 一样。这个操作产生Option
了一个函子(如果你想吓唬你的同事,你可以说“endofunctor”)flatMap
:Option
实际上是一个 monad,并flatMap
使其成为一个(与单个值的构造函数一起)。如果您有一个将值转换为 an 的函数,则可以使用此方法Option
,但是您拥有的值已经“包装”在 an 中Option
,因此flatMap
可以在应用该函数之前为您节省解包。例如,如果你有一个Option[Map[K,V]]
,你可以写mapOption.flatMap(_.get(key))
。如果你map
在这里使用一个简单的,你会得到一个Option[Option[V]]
,但flatMap
你会得到一个Option[V]
。这种方法比你想象的更酷,因为它允许以一种非常灵活的方式将函数链接在一起(这也是 Haskell喜欢monad 的原因之一)。flatten
: 如果你有一个 type 的值Option[Option[T]]
,flatten
把它变成一个Option[T]
. 它与 相同flatMap(identity(_))
。orElse
:如果你有几个包含在 s 中的替代方案Option
,并且你想要第一个包含实际值的替代方案,则可以将这些替代方案与orElse
:steakOption.orElse(hamburgerOption).orElse(saladOption)
getOrElse
:从 中获取值Option
,但如果为空,请指定默认值,例如nameOption.getOrElse("unknown")
。foreach
: 用里面的值做一些事情,如果它存在的话。isDefined
,isEmpty
: 判断 this 是否Option
有值。forall
,exists
: 测试给定谓词是否适用于该值。forall
与, 相同option.map(test(_)).getOrElse(true)
,exists
仅与false
默认值相同。toList
: 惊喜,它将 转换Option
为List
.
于 2011-07-26T21:50:30.743 回答
11
Option 上的许多方法可能更多是为了统一(与集合)而不是为了它们的有用性,因为它们都是非常小的函数,因此不会花费太多精力,但它们是有目的的,它们的含义是一旦你熟悉了集合框架就清楚了(正如人们常说的,Option 就像一个不能有多个元素的列表)。
forall 检查选项内值的属性。如果没有值,则检查通过。例如,如果在汽车租赁中,您可以使用一辆additionalDriver: Option[Person]
,您可以这样做
additionalDriver.forall(_.hasDrivingLicense)
如果允许几个额外的驱动程序并且你有一个列表,你会做的事情完全相同。
toList 可能是一个有用的转换。假设您有选项:List[Option[T]],并且您想获得一个 List[T],其中所有选项的值都是 Some。你可以做
for(option <- options; value in option.toList) yield value
(或更好options.flatMap(_.toList)
)
于 2011-07-26T16:38:12.467 回答
6
我有一个实际的toList
方法示例。您可以在第 72 行的Module.scala的scaldi(我的 Scala 依赖注入框架)中找到它:
在此上下文中,getBindings
方法可以返回一个元素,Nil
也可以List
只返回一个元素。我可以像Option
使用discoverBinding
. 我发现能够使用方法转换Option
为List
(空的或有一个元素)很方便toList
。
于 2011-07-26T16:14:42.040 回答