gpt4 book ai didi

scala - 与 Option.isEmpty 和 Option.get 相比,使用 Option.map 有什么优势?

转载 作者:行者123 更新时间:2023-12-04 23:16:50 31 4
gpt4 key购买 nike

我是来自 Java 背景的 Scala 新手,目前对考虑 Option[T] 的最佳实践感到困惑.

我觉得用 Option.map只是更实用和美观,但这不是说服其他人的好理由。有时, isEmpty 检查感觉更直接,因此更具可读性。有什么客观优势,还是只是个人喜好?

例子:

变化1:

someOption.map{ value => 
{
//some lines of code
}
} orElse(foo)

变体2:
if(someOption.isEmpty){
foo
} else{
val value = someOption.get
//some lines of code
}

我故意排除了使用 fold 的选项或模式匹配。我对治疗 Option 的想法并不满意现在作为一个集合,并为一个简单的 isEmpty 使用模式匹配检查是滥用模式匹配恕我直言。但无论我为什么不喜欢这些选项,我都希望将这个问题的范围保持在标题中命名的上述两个变体。

最佳答案

Is there any objective advantages, or is it just personal preference?



我认为客观优势和个人喜好之间只有一线之隔。你不能让人相信任何一个都有绝对的真理。

使用 Scala 构造的一元性质获得的最大优势是组合。无需“担心”内部值(value)即可将操作链接在一起的能力非常强大,不仅与 Option[T] 相关。 ,而且还与 Future[T] 合作, Try[T] , Either[A, B]并在它们之间来回移动(另见 Monad Transformers)。

让我们尝试看看如何在 Option[T] 上使用预定义的方法可以帮助控制流。例如,考虑这样一个案例,您有一个 Option[Int]只有当它大于一个值时才想要相乘,否则返回 -1。在命令式方法中,我们得到:
val option: Option[Int] = generateOptionValue

var res: Int = if (option.isDefined) {
val value = option.get
if (value > 40) value * 2 else -1
} else -1

Option 上使用集合样式方法,等价的看起来像:
val result: Int = option
.filter(_ > 40)
.map(_ * 2)
.getOrElse(-1)

现在让我们考虑一个组合案例。假设我们有一个可能会抛出异常的操作。此外,此操作可能会也可能不会产生值。如果它返回一个值,我们想用该值查询一个数据库,否则,返回一个空字符串。

使用 try-catch 查看命令式方法堵塞:
var result: String = _
try {
val maybeResult = dangerousMethod()
if (maybeResult.isDefined) {
result = queryDatabase(maybeResult.get)
} else result = ""
}
catch {
case NonFatal(e) => result = ""
}

现在让我们考虑使用 scala.util.Try连同 Option[String]并将两者组合在一起:
val result: String = Try(dangerousMethod())
.toOption
.flatten
.map(queryDatabase)
.getOrElse("")

我认为这最终归结为哪一个可以帮助您创建清晰的操作控制流。习惯使用 Option[T].map而不是 Option[T].get将使您的代码更安全。

总结一下,我不相信有一个真理。我确实相信组合会导致美观、可读、延迟安全代码的副作用,我完全赞成。我认为向其他人展示您的感受的最佳方式是向他们提供我们刚刚看到的示例,并让他们自己感受使用这些工具集可以发挥的作用。

关于scala - 与 Option.isEmpty 和 Option.get 相比,使用 Option.map 有什么优势?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38915244/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com