scala - if (Option.nonEmpty) 与 Option.foreach

标签 scala

如果设置了选项的值,我想执行一些逻辑。

来自java背景,我用过:

if (opt.nonEmpty) {
   //something
}

再深入一点,我可以这样写:
opt.foreach(o => {
  //something 
})

哪一个更好? “foreach” 听起来更“惯用”,Java 更少,但可读性更差——应用于单个值的“foreach”听起来很奇怪。

最佳答案

您的示例不完整,并且您没有使用最少的语法。只需比较这两个版本:

if (opt.nonEmpty) {
  val o = opt.get
  // ...
}

// vs

opt foreach {
  o => // ...
}


if (opt.nonEmpty)
  doSomething(opt.get)

// vs

opt foreach doSomething

在这两个版本中,if 中有更多的语法开销。解决方案,但我同意 foreachOption如果您仅将其视为可选值,可能会令人困惑。

而是 foreach描述你想做一些副作用,如果你想到 Option 就很有意义作为一个单子(monad)和foreach只是一种改造它的方法。使用 foreach此外,它还有一个很大的优势,那就是它使重构更容易——您只需将其类型更改为 List或任何其他 monad,您将不会收到任何编译器错误(因为 Scalas 强大的集合库,您不受限于仅使用适用于 monad 的操作,在很多类型上定义了很多方法)。

关于scala - if (Option.nonEmpty) 与 Option.foreach,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18163828/

相关文章:

scala - 反向路由 - 使用多个路由文件 Play 2.2.x 应用程序

xml - 在Scala中评估Xpath

scala - 为什么 sbt compile 不会将非托管资源复制到类路径?

scala - Scala:构造函数采用Seq或varargs

JavaFX 和回调

scala - 如何在不使用 Java 反射 API 的情况下从 HashMap 中获取对象?

scala - 如何在 Scala 中提取以特定值开头的 Array[String] 的元素?

scala - 从包装在 Option[] 中的对象读取多个变量

scala - Scala映射到HashMap

java - 如何从 Scala 中的辅助构造函数访问字段?