为什么foreach比获取Scala选项更好?

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检查的巨大"金字塔".


Lan*_*dei 17

对于实际问题已经有了很好的答案,但是对于更多Option- 你应该看看托尼莫里斯的选项备忘.


dhg*_*dhg 6

它之所以更有效申请之类的东西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.