【发布时间】:2019-02-09 13:56:26
【问题描述】:
我有一组按顺序完成的操作,但如果中间序列返回“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"))
}
}
}
}
}
【问题讨论】:
标签: scala functional-programming optional flatmap