使用一些Scala Option方法的示例

Mic*_*ael 7 scala scala-option

在这里读过推荐我的博文.现在我想知道这些方法有用的是什么.您可以显示使用的例子(与)和的?forallforeachtoListOption

Lan*_*dei 24

  • map:允许你转换一个"内部"的值Option,正如你可能已经知道List的那样.这个操作是Option一个算子(如果你想吓唬你的同事,可以说"endofunctor")
  • flatMap:Option实际上是一个monad,并flatMap使其成为一个(与单个值的constuctor一样).如果您有一个将值转换为a的函数,则可以使用此方法Option,但是您已经将值"包装"在一个函数中Option,因此flatMap在应用函数之前可以省去解包.例如,如果你有Option[Map[K,V]],你可以写mapOption.flatMap(_.get(key)).如果你map在这里使用一个简单的,你会得到一个Option[Option[V]],但随着flatMap你得到一个Option[V].这种方法比你想象的要冷,因为它允许以非常灵活的方式将函数链接在一起(这是Haskell 喜欢 monad的原因之一).
  • 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为a List.


Did*_*ont 10

许多期权的方法可以有更多的一致性的缘故(含集合),而不是其用处,因为他们都是非常小的功能,所以不要放过多的努力,但他们服务于一个目的,其含义一旦你熟悉了集合框架就会清楚(正如人们常说的那样,Option就像一个不能有多个元素的列表).

forall检查选项内值的属性.如果没有值,则检查通过.例如,如果在汽车租赁中,您可以获得一个additionalDriver: Option[Person],您可以这样做

additionalDriver.forall(_.hasDrivingLicense)
Run Code Online (Sandbox Code Playgroud)

如果允许几个额外的驱动程序并且你有一个列表,那么你会做同样的事情.

toList可能是一个有用的转换.假设您有选项:List [Option [T]],并且您希望获得List [T],其中包含所有选项的值.你可以做

for(option <- options; value in option.toList) yield value
Run Code Online (Sandbox Code Playgroud)

(或更好options.flatMap(_.toList))


ten*_*shi 6

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

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

在此上下文中,getBindings方法可以返回一个元素NilList仅返回一个元素.我可以检索它OptiondiscoverBinding.我发现能够使用方法转换OptionList(空或具有一个元素)很方便toList.