【问题标题】:Examples of using some Scala Option methods使用一些 Scala Option 方法的示例
【发布时间】:2011-07-26 16:04:02
【问题描述】:

我已经阅读了blog post 推荐给我的here。现在我想知道这些方法有什么用。你能举出使用forall(而不是foreach)和toListOption 的例子吗?

【问题讨论】:

    标签: scala scala-option


    【解决方案1】:
    • map:允许您在 Option 的“内部”转换值,正如您可能已经知道的 Lists。这个操作使Option成为一个函子(如果你想吓唬你的同事,你可以说“endofunctor”)
    • flatMapOption 实际上是一个 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: 用里面的值做一些事情,如果它存在的话。
    • isDefinedisEmpty:判断这个Option是否有值。
    • forallexists:测试给定谓词是否适用于该值。 foralloption.map(test(_)).getOrElse(true) 相同,exists 相同,只是默认使用false
    • toList:惊喜,它将Option 转换为List

    【讨论】:

      【解决方案2】:

      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)

      【讨论】:

        【解决方案3】:

        我有一个toList 方法的实际示例。你可以在 Module.scala 的第 72 行的 scaldi(我的 Scala 依赖注入框架)中找到它:

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

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

        【讨论】:

        • @AdamFraser:很抱歉。我更新了链接,并且还使用了特定的提交树而不是 master。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-10-27
        • 2016-03-03
        • 2011-09-05
        • 1970-01-01
        • 1970-01-01
        • 2016-05-17
        相关资源
        最近更新 更多