为什么使用 foreach, map, flatMap 等等比使用更好 get 对于Scala选项?如果我使用isEmpty 我可以打电话 get 安全。

有帮助吗?

解决方案

好吧,这又回到了“告诉,不要问”。考虑这两条线:

if (opt.isDefined) println(opt.get)
// versus
opt foreach println

在第一种情况下,您正在内部看 opt 然后根据您看到的反应。在第二种情况下,您只是在告诉 opt 您想做的事情,让它处理。

第一种情况对 Option, ,重复它的内部逻辑,易碎并且容易出现错误(如果不正确地书写,可能会导致运行时错误,而不是编译时错误)。

除此之外,它是不可合理的。如果您有三个选择,一个用于理解的单个选择会照顾他们:

for {
  op1 <- opt1
  op2 <- opt2
  op3 <- opt3
} println(op1+op2+op3)

if, ,事情开始变得凌乱。

其他提示

使用的一个很好的理由 foreach 正在用嵌套选项解析一些东西。如果你有类似的东西

val nestedOption = Some(Some(Some(1)))
for {
  opt1 <- nestedOption
  opt2 <- opt1
  opt3 <- opt2
} println(opt3)

控制台打印 1. 。如果将其扩展到一个可以选择存储某物的类的类别的情况下,该类别又存储了另一个参考,则可以使您避免避免使用无/检查的巨大“金字塔”。

实际问题已经有很好的答案,但是要更多 Option- 您绝对应该检查一下 托尼·莫里斯(Tony Morris)的选项备忘单.

应用程序更有用的原因 map, foreach, , 和 flatMap 直接到达 Option 而不是使用 get 然后执行该功能是它在任何一个上工作 Some 或者 None 而且您不必进行特殊检查即可确保其价值存在。

val x: Option[Int] = foo()
val y = x.map(_+1) // works fine for None
val z = x.get + 1  // doesn't work if x is None

结果 y 这是一个 Option[Int], ,这是可取的,因为如果 x 是可选的,然后 y 也可能不确定。自从 get 不起作用 None, ,您必须做很多额外的工作,以确保您没有遇到任何错误;为您完成的额外工作 map.

简单地说:

  • 如果您需要执行某些操作(当您定义选项时,只有在不需要捕获每个调用的返回值的过程中)(即 Some): 利用 foreach (如果您关心每个调用的结果,请使用 map)

  • 如果您需要做某事,如果已定义该选项,则需要做其他事情,如果不是:使用:使用: isDefined 在if语句中

  • 如果您需要该值,则该选项是 Some, ,或默认值如果是 None: : 利用 getOrElse

试图通过 get 是您需要打电话的更命令的风格 该怎么做以及如何做 。换句话说,我们正在决定事物并更多地挖掘 Options 内部。然而 map,flatmap 是我们所说的更实用的做事方式 该怎么做,但不做.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top