我想从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 :在没有指出我的问题的情况下进行否决是没有道理的。它只是完全消极了寻求新知识的动力。
答案 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+_)