与Option.isEmpty和Option.get相比,使用Option.map有什么优势?

Hengrui Jiang

我是来自Java背景的Scala的新手,目前对最佳实践的考虑感到困惑Option[T]

我觉得使用Option.map功能更实用,更美观,但这并不是说服他人的好理由。有时,isEmpty检查感觉更直接,因此更具可读性。有任何客观优势,还是仅仅是个人喜好?

例子:

变体1:

someOption.map{ value => 
  {
    //some lines of code
  }
} orElse(foo)

变体2:

if(someOption.isEmpty){
  foo
} else{
  val value = someOption.get
  //some lines of code
}

我故意排除了使用fold或模式匹配的选项Option对现在将其视为集合的想法不满意,并且使用模式匹配进行简单isEmpty检查会滥用模式匹配恕我直言。但是,无论我为什么不喜欢这些选项,我都希望将这个问题的范围限制为标题中命名的上述两个变体。

阿列克谢·罗曼诺夫(Alexey Romanov)

使用模式匹配进行简单的isEmpty检查会滥用模式匹配恕我直言

如果您只想isEmpty检查,isEmpty/isDefined就很好了。但是在您的情况下,您也想获得价值。为此,使用模式匹配不是滥用。这正是基本用例。使用get可以非常容易地产生错误,例如忘记检查isDefined或进行错误的检查:

if(someOption.isEmpty){
  val value = someOption.get
  //some lines of code
} else{
  //some other lines
}

希望测试能够抓住它,但是没有理由满足“希望”。

出于相同的原因,组合器(map和朋友)也比get模式匹配更好,因为模式匹配是:它们不允许您犯这种错误。在模式匹配和组合器之间进行选择是一个不同的问题。通常,首选组合器,因为它们更容易组合(如Yuval的答案所解释)。如果您想做一个单独的组合器,我通常会选择它们;如果您需要组合(如map ... getOrElse)或fold带有多行分支的组合,则取决于具体情况。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在.map()和.getOrElse()中使用Option

来自分类Dev

Either和Option有什么区别?

来自分类Dev

更快地实现Option.isEmpty?

来自分类Dev

如何使用Option.map和Option.bind重写多个null检查?

来自分类Dev

const {service} = option和const service = option(express js)有什么区别?

来自分类Dev

Rust中的Some和Option有什么区别?

来自分类Dev

为什么Map withDefaultValue返回Option = None

来自分类Dev

新的Option()与<option>

来自分类Dev

比赛背后的魔力:`&std :: option :: Option <ListNode> == std :: option :: Option <_>没有实现

来自分类Dev

如何使用Js.Option.map?

来自分类Dev

调用 Option::map 后如何使用值?

来自分类Dev

PHP和2个<option>列表,为什么$ _POST()没有使用名称标签...?

来自分类Dev

在Scala中是否可以同时具有隐式Ordering [Option [T]和Ordered [Option [T]]?

来自分类Dev

Option :: map的结果寿命不足

来自分类Dev

为什么Option不从Seq和Set继承?

来自分类Dev

enum和Option <enum>的内存表示形式是什么?

来自分类Dev

为什么Option <&String>不强迫Option <&str>?

来自分类Dev

解析JSON和Option [Any]

来自分类Dev

解析JSON和Option [Any]

来自分类Dev

使用Option()的Scala Future

来自分类Dev

使用Jack和Jill有什么优势?

来自分类Dev

带有Selection和Clear Option的DropdownList(Glyphicon删除圆圈)?

来自分类Dev

<option>可以有多个名称吗?获取<option>的数据属性?

来自分类Dev

和jsp相比,angularjs有什么优势,反之亦然

来自分类Dev

为Option <T>和Option <&T>实现特征

来自分类Dev

使用 Scala 在一行中打印并从 Option.isEmpty 上的方法返回

来自分类Dev

Option [Map [String,String]]`上的.get(“ key”)`如何工作

来自分类Dev

为什么要尝试!()和?在不返回Option或Result的函数中使用时无法编译?

来自分类Dev

netty 4.x中的ServerBootstrap.option()和ServerBootstrap.childOption()有什么区别

Related 相关文章

  1. 1

    在.map()和.getOrElse()中使用Option

  2. 2

    Either和Option有什么区别?

  3. 3

    更快地实现Option.isEmpty?

  4. 4

    如何使用Option.map和Option.bind重写多个null检查?

  5. 5

    const {service} = option和const service = option(express js)有什么区别?

  6. 6

    Rust中的Some和Option有什么区别?

  7. 7

    为什么Map withDefaultValue返回Option = None

  8. 8

    新的Option()与<option>

  9. 9

    比赛背后的魔力:`&std :: option :: Option <ListNode> == std :: option :: Option <_>没有实现

  10. 10

    如何使用Js.Option.map?

  11. 11

    调用 Option::map 后如何使用值?

  12. 12

    PHP和2个<option>列表,为什么$ _POST()没有使用名称标签...?

  13. 13

    在Scala中是否可以同时具有隐式Ordering [Option [T]和Ordered [Option [T]]?

  14. 14

    Option :: map的结果寿命不足

  15. 15

    为什么Option不从Seq和Set继承?

  16. 16

    enum和Option <enum>的内存表示形式是什么?

  17. 17

    为什么Option <&String>不强迫Option <&str>?

  18. 18

    解析JSON和Option [Any]

  19. 19

    解析JSON和Option [Any]

  20. 20

    使用Option()的Scala Future

  21. 21

    使用Jack和Jill有什么优势?

  22. 22

    带有Selection和Clear Option的DropdownList(Glyphicon删除圆圈)?

  23. 23

    <option>可以有多个名称吗?获取<option>的数据属性?

  24. 24

    和jsp相比,angularjs有什么优势,反之亦然

  25. 25

    为Option <T>和Option <&T>实现特征

  26. 26

    使用 Scala 在一行中打印并从 Option.isEmpty 上的方法返回

  27. 27

    Option [Map [String,String]]`上的.get(“ key”)`如何工作

  28. 28

    为什么要尝试!()和?在不返回Option或Result的函数中使用时无法编译?

  29. 29

    netty 4.x中的ServerBootstrap.option()和ServerBootstrap.childOption()有什么区别

热门标签

归档