【问题标题】:How to simplify method using Option or PartialFunction如何使用 Option 或 PartialFunction 简化方法
【发布时间】:2018-01-19 11:10:52
【问题描述】:

我需要一些帮助来修改(简化)我的代码。
这里举个例子:

def getBids(rawBids: RDD[List[String]], exchangeRates: Map[String, Double]): RDD[BidItem] = {
    rawBids.filter(bidList => !bidList(2).matches(ERROR_REGEXP))
      .flatMap(bidList => {
        Constants.TARGET_LOSAS.map { losa =>
          val indexOfLosa = Constants.BIDS_HEADER.indexOf(losa)
          if (bidList(indexOfLosa) != null && !bidList(indexOfLosa).equals("") && isDoubleNumber(bidList(indexOfLosa))) {
            BidItem(bidList.head, bidList(1), losa, bidList(indexOfLosa).toDouble)
          } else {
            BidItem(bidList.head, bidList(1), losa, 0)
          }
        }
      })
      .filter(unit => unit.price != 0)
      .map(unit => {
        val convertedPrice = usdToEur(unit.price, unit.bidDate, exchangeRates)
        val convertedDate = changeDateFormat(unit.bidDate)
        BidItem(unit.motelId, convertedDate, unit.loSa, convertedPrice)
      })
  }

我需要更改 flatMap 方法并避免出现“ELSE”部分代码的情况
据我所知,我们可以使用偏函数或[Option]。如果我们的“if”语句为 FALSE,它可以帮助我们避免这种情况。如果我从代码中删除 ELSE 部分,scala 不会给我编译代码的机会。谢谢!

【问题讨论】:

  • 代码通常代表一个实现某些要求的逻辑决策过程。您不能在不指定新要求的情况下“摆脱”某些代码。

标签: scala flatmap partialfunction


【解决方案1】:
val doubleValue = Option(bidList(indexOfLosa))
  .filterNot(_.equals(""))
  .filter(isDoubleNumber)
  .map(_.toDouble)
  .getOrElse(0)
BidItem(bidList.head, bidList(1), losa, doubleValue)

【讨论】:

  • 谢谢谢尔盖。但是我们如何才能使用偏函数呢?如果不是正确的doubleValue,没有0值,有什么办法不创建BidItem?
  • @ПавелОрлов 是的,只需使用 map(x => BidItem(bidList.head, bidList(1), losa, x)) 而不是 getOrElse。这会给你一个Option[BidItem],如果它不是一个合适的双精度,它将是None。当 rdd flatmap 函数的结果是 None 时,它将从数据集中删除(即只有带有值的选项在结果 rdd 中)
猜你喜欢
  • 1970-01-01
  • 2011-07-08
  • 2010-12-26
  • 2012-01-10
  • 2018-03-15
  • 2016-05-17
  • 1970-01-01
  • 1970-01-01
  • 2018-10-08
相关资源
最近更新 更多