[英]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.