Scala - Как вернуть Option [String] вместо Any с сопоставлением с образцом? - PullRequest
0 голосов
/ 18 октября 2018

Я хотел, чтобы объекты Sale из HBase были объединены с их идентификаторами HBase (строковое представление ImmutableBytesWritable) как Option[String].

Сначала я реализовал метод processSales, чтобы он просто возвращал все идентификаторы продаж + hBase, как показано ниже:

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?

UPD: Понижение рейтинга без указания проблем с моим вопросом не 'не имеет смысла.Это просто полностью демотивирует поиск новых знаний.

Ответы [ 2 ]

0 голосов
/ 18 октября 2018

Разве не так просто, как показано ниже?

 myThriftCodec.invert(result.getValue("binary", "object"))
  .toOption
  .filter(_.metric_1 == null)
  .map(hBaseId+_)
0 голосов
/ 18 октября 2018

Вам не хватает второго параметра в регистре совпадений в вашем else, поэтому он возвращает Unit, когда метрика не равна нулю, поэтому Unit в одном случае и Option (String) в другом, компилятор предполагает, что вы хотите Any asтип возврата

Что вы хотите вернуть, когда значение 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
 }
...