лучший способ написать scala функцию с условиями - PullRequest
1 голос
/ 26 мая 2020

У меня есть эта функция, которую я использую как UDF в Spark.

def convertRecipeTimeToMinutes: String => Int =
    (time: String) => {
      val size = time.size
      val res =
        if (size == 2)
          0
        else {
          var recipeTime = 0
          val builder    = new StringBuilder
          val slice      = time.slice(2, size)
          for (i <- slice) {
            if (i.isDigit) {
              builder.append(i)
            } else {
              if (i == 'H')
                recipeTime += builder.toInt * 60
              else if (i == 'M')
                recipeTime += builder.toInt

              builder.clear
            }
          }
          recipeTime
        }
      res
    }

Она преобразует данные во время в минутах.

Пример входных данных

xx25M
xx1H
xx1H30M
xx

Пример выходных данных

25
60
90
0

он выполняет требуемую работу, но я хочу знать и узнать, есть ли лучший способ написать это? Сопоставление с образцом, частичная функция или что-то еще?

1 Ответ

4 голосов
/ 26 мая 2020

Вы можете использовать регулярное выражение для извлечения часов и минут из строки:

def convertRecipeTimeToMinutes: String => Int = { time =>
  val Time = """\D*(?:(\d+)H)?(?:(\d+)M)?""".r 
  time match {
    case Time(hours, minutes) => 
      Option(hours).fold(0)(_.toInt * 60) + Option(minutes).fold(0)(_.toInt)
  }
}

Проверьте https://regex101.com/r/vFkY9G/1, чтобы увидеть, как работает это регулярное выражение.

...