gpt4 book ai didi

scala - 函数式 scala-如何避免可选映射上的深度嵌套

转载 作者:行者123 更新时间:2023-12-01 06:24:30 27 4
gpt4 key购买 nike

我有一组按顺序完成的操作,但如果中间序列返回“null”,我想提前中止操作(跳过后续步骤)。

我想出了一个这样的函数,它给定一个输入参数,对 Redis 执行多个操作,并返回一个产品(如果存在)。由于中间请求之一可能返回空值,因此整个操作可能“失败”,我想短路随后出现的不必要的步骤。

这里的嵌套变得越来越疯狂,我想让它更清晰。是否有适当的“功能”方法来执行这种类型的“if/else”短路?

def getSingleProduct(firstSku: String): Option[Product] = {
val jedis = pool.getResource
val sid: Array[Byte] = jedis.get(Keys.sidForSku(firstSku, sectionId, feedId).getBytes)
Option(sid).flatMap {
sid: Array[Byte] =>
Option(jedis.get(Keys.latestVersionForSid(sectionId, feedId, sid))) flatMap {
version: Array[Byte] =>
Option(Keys.dataForSid(sectionId, feedId, version, sid)) flatMap {
getDataKey: Array[Byte] =>
Option(jedis.get(getDataKey)) flatMap {
packedData: Array[Byte] =>
val data = doSomeStuffWith(packedData)
Option(Product(data, "more interesting things"))
}
}
}
}
}

最佳答案

执行此操作的方法是使用 for:

for {
sid <- Option(jedis.get(...))
version <- Option(jedis.get(..., sid, ...))
getDataKey <- Option(jedis.get(...version,...))
packedData <- Option(jedis.get(getDataKey))
} yield {
// Do stuff with packedData
}

如果任何 get 调用返回 None,则返回 None,否则将返回 Some(x) code> 其中 xyeild 表达式的结果。

您可能还需要考虑为 jedis.get 编写一个包装器,它返回 Option(x) 而不是使用 null 作为错误结果。

关于scala - 函数式 scala-如何避免可选映射上的深度嵌套,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52167878/

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