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

时间:2018-10-18 10:09:02

标签: scala apache-spark hbase

我想从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的串联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)
}
  }

但是似乎我在这里丢失了一些内容,即使我像这样Any包裹了该方法,该方法也会返回Option(hBaseId + sale)

为了返回Option[String]且销售额为metric_1 == null的{​​{1}},我该如何解决?

UPD :在没有指出我的问题的情况下进行否决是没有道理的。它只是完全消极了寻求新知识的动力。

2 个答案:

答案 0 :(得分:1)

您在别的情况下缺少匹配大小写的第二个选项,因此当度量标准不为null时,它将返回Unit,因此在一种情况下返回Unit,在另一种情况下返回Option(String),编译器会猜测您希望使用Any作为返回类型

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

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为null时返回某些内容,因此据我所知,这是最好的解决方案:

为什么还要对两次相同的变量进行模式匹配?

   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
 }

答案 1 :(得分:1)

不是那么简单吗?

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