当前位置: 首页 > 知识库问答 >
问题:

functional Scala-如何避免在可选映射上进行深度嵌套

司马洲
2023-03-14

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

我想出了一个这样的函数,它给出了一个输入参数,对Redis执行几个操作,如果存在的话,它将返回一个乘积。由于中间请求中有一个可能返回空值,所以整个操作可能会“失败”,因此我想缩短后续的不必要步骤。

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"))
                }
            }
        }
    }
  }

共有1个答案

慕容劲
2023-03-14

这样做的方法是使用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),其中xyeild表达式的结果。

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

 类似资料:
  • 我有以下实体: 我尝试过创建@OneToOne(FetchType.lazy),但不起作用,它仍然提取不需要的信息。 如何避免获取复合对象? 我希望最终结果不包含Address对象,因为它在20个场景中需要一次,我可以分别获取它们。 任何想法,如何实现这一点。 谢谢

  • 想象一下我有一个阶级家庭。它包含一个人员列表。每个(班级)人都有一个(班级)地址。每个(类)地址都包含一个(类)邮政编码。任何“中间”类都可以为空。 那么,有没有一种简单的方法可以在不必在每一步都检查null的情况下访问PostalCode?i、 例如,有没有办法避免以下菊花链代码?我知道没有“原生”Java解决方案,但我希望如果有人知道某个库或其他东西。(已选中Commons 不,不能改变结构。

  • 问题内容: 您如何深度克隆Javascript对象? 我知道有很多基于类似的框架的功能,但是我不想使用类似的框架。 创建深度克隆的最优雅或最有效的方法是什么。 我们确实关心诸如克隆数组之类的边缘情况。不打破原型链,处理自我参考。 我们不在乎是否支持DOM对象的复制,因为存在该原因。 正如我主要想在使用V8引擎的ES5功能中使用深度克隆一样。 [编辑] 在有人建议我之前,先通过原型继承对象创建副本与

  • 在Java,有没有一种方法可以避免在调用的每个级别上嵌套null检查,以确保沿途没有阻止下一次调用的null。有没有一个优雅的方法来做这件事? 例如: Objone.ObjTwo.ObjTree.ObjFour.ObjF

  • 问题内容: 避免嵌套查询有多重要。 我一直学会避免像瘟疫一样躲避它们。但是对我来说,它们是最自然的事情。在设计查询时,我首先写的是嵌套查询。然后,我将其转换为联接,有时需要花费很多时间才能正确。而且很少会带来很大的性能提升(有时确实会提高) 他们真的那么糟糕吗?有没有一种方法可以使用没有临时表和文件排序的嵌套查询 问题答案: 这确实取决于我遇到的情况,我可以通过使用子查询来改进一些查询。 我知道的

  • 在我的代码中,我有: 一个扩展JComponent的抽象类,其中包含一些JTextFields。JTextFields是不可编辑的。JComponent类实现了MouseListener:-当mouseEnted事件触发时,将向其添加一个边框。-当mouseExted事件触发时,边框被删除。-当mouseClick事件触发时,该组件的所有字段都设置为可编辑。 这应该是这样的: 用户想要编辑一个字段