题
为什么使用 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
是我们所说的更实用的做事方式 该怎么做,但不做.