使用一些Scala Option方法的示例

时间:2011-07-26 16:04:02

标签: scala scala-option

我已阅读推荐给我的blog post here。现在我想知道这些方法有用的是什么。您是否可以展示使用forall {而不是foreach}和toList的{​​{1}}的示例?

3 个答案:

答案 0 :(得分:24)

  • map:允许您将Option内部的值转换为List,您可能已经知道Option。此操作使flatMap成为一个仿函数(如果你想吓唬你的同事,可以说“endofunctor”)
  • OptionflatMap实际上是一个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:对内部的值执行某些操作(如果存在)。
  • isDefinedisEmpty:确定此Option是否包含值。
  • forallexists:测试给定谓词是否适用于该值。 foralloption.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行找到它:

https://github.com/OlegIlyenko/scaldi/blob/f3697ecaa5d6e96c5486db024efca2d3cdb04a65/src/main/scala/scaldi/Module.scala#L72

在此上下文中,getBindings方法只能返回一个元素NilList。我可以使用Option将其检索为discoverBinding。我发现使用Option方法将List转换为toList(空的或有一个元素)很方便。