8

我在这里阅读了推荐我的博客文章。现在我想知道这些方法有什么用。你能举出使用(而不是)和的例子吗?forallforeachtoListOption

4

3 回答 3

27
  • map:允许您在“内部”转换值 an Option,正如您可能已经知道的Lists 一样。这个操作产生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,并且你想要第一个包含实际值的替代方案,则可以将这些替代方案与orElsesteakOption.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: 惊喜,它将 转换OptionList.
于 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 依赖注入框架)中找到它:

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

在此上下文中,getBindings方法可以返回一个元素,Nil也可以List只返回一个元素。我可以像Option使用discoverBinding. 我发现能够使用方法转换OptionList(空的或有一个元素)很方便toList

于 2011-07-26T16:14:42.040 回答