繁体   English   中英

Scala - 如何使用模式匹配返回 Option[String] 而不是 Any?

[英]Scala - How to return Option[String] instead of Any with pattern matching?

我想将来自 HBase 的 Sale 对象与它们的 HBase id( ImmutableBytesWritable的字符串表示)连接为Option[String]

首先,我实现了processSales方法,以便它只返回所有 sales + hBase id,如下所示:

private def processSales (result: Result, hBaseId: String): Option[String] = {
    val triedSale: Try[Sale] = myThriftCodec.invert(result.getValue("binary", "object"))
    triedSale match {
      case Success(sale) => Some(hBaseId + sale)
      case _ => None
    }
  }

现在我只想返回那些串联的hBaseIds + Sales其中 Sales 有metric_1 == null所以我尝试了以下操作:

private def processSales (result: Result, hBaseId: String): Any = {
    val triedSale: Try[Sale] = myThriftCodec.invert(result.getValue("binary", "object"))
    triedSale match {
      case Success(sale) => Some(hBaseId + sale)
      case _ => None
    } 
triedSale match {
  case someSale => if (someSale.get.metric_1 = null) someSale.map(sale => hBaseId + sale)
}
  }

但似乎我在这里遗漏了一些东西,即使我像这样包装Option(hBaseId + sale) ,该方法也会返回Any

我应该在我的逻辑中修复什么才能返回Option[String] ,而销售额为metric_1 == null

UPD:在没有指出我的问题的问题的情况下进行投票是没有意义的。 它只是完全削弱了寻求新知识的动力。

您在 else 中缺少匹配案例的第二个选项,因此当指标不为空时它返回 Unit,因此在一种情况下为 Unit,在另一种情况下为 Option(String),编译器猜测您想要 Any 作为返回类型

当 metric_1 不为空时,你想返回什么? 在此示例中,您返回完全相同的输入:

triedSale match {
  case someSale => if (someSale.get.metric_1 = null) someSale.map(s => hBaseId + s) else someSale
}  

或者以更优雅的方式,您可以:

triedSale match {
      case Success(metric_1) if metric_1 = null => Some(hBaseId + metric_1)
      case Success(metric_1) if metric_1 != null => triedSale
      case _ =>  None
 }

编辑

根据评论,您只想在 metric_1 为空时返回一些内容,因此这是我理解的最佳解决方案:

另外,你为什么要模式匹配同一个变量两次?

   triedSale match {
      case someSale => if (someSale.get.metric_1 = null) someSale.map(s => hBaseId + s) else None
    }  

或者像这样:

triedSale match {
      case Success(metric_1) if metric_1 = null => Some(hBaseId + metric_1)
      case _ =>  None
 }

是不是像下面这么简单?

 myThriftCodec.invert(result.getValue("binary", "object"))
  .toOption
  .filter(_.metric_1 == null)
  .map(hBaseId+_)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM