【发布时间】:2011-07-26 16:04:02
【问题描述】:
【问题讨论】:
标签: scala scala-option
【问题讨论】:
标签: scala scala-option
map:允许您在 Option 的“内部”转换值,正如您可能已经知道的 Lists。这个操作使Option成为一个函子(如果你想吓唬你的同事,你可以说“endofunctor”)flatMap:Option 实际上是一个 monad,flatMap 使它成为一个(与单个值的构造函数一起)。如果您有一个将值转换为Option 的函数,则可以使用此方法,但是您拥有的值已经“包装”在Option 中,因此flatMap 在应用该函数之前为您节省了展开。例如。如果你有Option[Map[K,V]],你可以写mapOption.flatMap(_.get(key))。如果你在这里使用一个简单的map,你会得到一个Option[Option[V]],但是使用flatMap你会得到一个Option[V]。这种方法比你想象的更酷,因为它允许以一种非常灵活的方式将函数链接在一起(这也是 Haskell 喜欢 monads 的原因之一)。flatten:如果您有一个 Option[Option[T]] 类型的值,flatten 会将其转换为 Option[T]。与flatMap(identity(_))相同。orElse:如果您有几个替代方案包含在Options 中,并且您想要第一个实际包含值的替代方案,您可以将这些替代方案与orElse 链接起来:steakOption.orElse(hamburgerOption).orElse(saladOption)
getOrElse:从Option 中获取值,但如果为空,请指定默认值,例如nameOption.getOrElse("unknown")。 foreach: 用里面的值做一些事情,如果它存在的话。isDefined、isEmpty:判断这个Option是否有值。forall、exists:测试给定谓词是否适用于该值。 forall 与option.map(test(_)).getOrElse(true) 相同,exists 相同,只是默认使用false。toList:惊喜,它将Option 转换为List。 【讨论】:
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))
【讨论】:
我有一个toList 方法的实际示例。你可以在 Module.scala 的第 72 行的 scaldi(我的 Scala 依赖注入框架)中找到它:
在这种情况下,getBindings 方法可以返回只有一个元素的 Nil 或 List。我可以用discoverBinding 将其检索为Option。我发现能够使用toList 方法将Option 转换为List(为空或只有一个元素)很方便。
【讨论】: