Mic*_*ael 47 scala scala-option
为什么使用foreach,map,flatMap等是不是用认为是更好的get斯卡拉选项?如果我使用isEmpty我可以get安全地打电话.
Dan*_*ral 79
嗯,有点回到"告诉,不要问".考虑以下两行:
if (opt.isDefined) println(opt.get)
// versus
opt foreach println
Run Code Online (Sandbox Code Playgroud)
在第一种情况下,您正在寻找内部opt,然后根据您所看到的情况做出反应.在第二种情况下,您只是告诉opt您想要做什么,并让它处理它.
第一种情况了解太多Option,复制内部逻辑,脆弱且容易出错(如果写错了,可能会导致运行时错误,而不是编译时错误).
除此之外,它不可组合.如果你有三个选项,一个理解就可以解决它们:
for {
op1 <- opt1
op2 <- opt2
op3 <- opt3
} println(op1+op2+op3)
Run Code Online (Sandbox Code Playgroud)
有了if,事情开始变得混乱很快.
Dyl*_*lan 21
使用的一个很好的理由是使用foreach嵌套选项解析某些东西.如果你有类似的东西
val nestedOption = Some(Some(Some(1)))
for {
opt1 <- nestedOption
opt2 <- opt1
opt3 <- opt2
} println(opt3)
Run Code Online (Sandbox Code Playgroud)
控制台打印1.如果你将这个扩展到一个类,你可以选择存储对某个东西的引用,然后存储另一个引用,为了理解,你可以避免使用None/Some检查的巨大"金字塔".
它之所以更有效申请之类的东西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
Run Code Online (Sandbox Code Playgroud)
y这里的结果是a Option[Int],这是可取的,因为如果x是可选的,那么y也可能是未确定的.既然get不起作用None,你必须做一些额外的工作,以确保你没有得到任何错误; 为你完成的额外工作map.
| 归档时间: |
|
| 查看次数: |
12922 次 |
| 最近记录: |