【问题标题】:How to parse None received for a Map value together with a function call?如何解析接收到的映射值和函数调用的无?
【发布时间】:2019-06-19 19:18:43
【问题描述】:

最初我编写了一个方法来解析各种指标的布尔值,并且只对获取truefalse 感兴趣。所以我使用fold 来处理非空选项的值。

    def parseMetrics(metricKeys: Seq[String], metricsMap: mutable.Map[String, lang.Boolean],
                   transactionValue: String): List[String] = {
    metricKeys.map { metricKey =>
      metricsMap.get(metricKey).fold(StringUtils.EMPTY) { metricValue =>
        if (metricValue) "Y" else "N"
      }
    }.toList
  }

现在我决定更改逻辑以使用度量值为空且​​metricsMap.get(metricKey) 返回无的情况

// 伪代码

val maybeBoolean = metricsMap.get(metricKey)
case Some(maybeBoolean) - evaluate metricValue to "Y" or "N" as before
case None && isValidTransaction(transactionValue) then metricValue = "V"

但我可能遗漏了一些东西,并且在这种情况下模式匹配不起作用。函数isValidTransaction(transactionValue) 无法解析。我尝试匹配 None 并且函数调用失败。

我应该如何修复逻辑以使其正常工作?

【问题讨论】:

    标签: scala collections pattern-matching


    【解决方案1】:

    试试

    def parseMetrics(metricKeys: Seq[String], metricsMap: Map[String, Boolean], transactionValue: String): List[String] = {
      metricKeys.map(metricsMap.get).map {
        case Some(true) => "Y"
        case Some(false) => "N"
        case None if isValidTransaction(transactionValue) => "V"
        case None => "unknown"
      }.toList
    }
    

    【讨论】:

    • 作为一种可能的替代方案,由于您正在处理布尔值,您可以考虑为每个可能的结果定义一个案例作为模式匹配的一部分,而不是使用嵌套的 if:case Some(true) => "Y"; case Some(false) => "F" 等。
    • 感谢您将我的建议纳入您的回答中。 :)
    • 谢谢。您的解决方案存在一个问题。由于我使用的是mutable.Map[String, lang.Boolean],因此在尝试进行模式匹配时会得到Type mismatch: expected Option[Boolean] => NotInferedB, actual: String
    • @samba 我似乎无法重现。更改为metricsMap: mutable.Map[String, Boolean] 然后传入mutable.Map("1" -> true, "2" -> false) 之类的东西似乎在我的机器上工作正常。
    猜你喜欢
    • 2018-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-25
    • 2016-04-06
    相关资源
    最近更新 更多