функциональный способ пройти серию валидации в Scala - PullRequest
0 голосов
/ 27 февраля 2019

У меня есть некоторые данные, которые должны пройти серию проверок.У меня есть следующий код в стиле Java, который работает, но кажется некрасивым.Просто интересно, каков будет функциональный / Scala способ справиться с такими ситуациями?Спасибо!

def validateData(data: String): Boolean = {
  try {
    if(!validate1(data)) {
      Logger.error("error1")
      return false
    }
    if(!validate2(data)) {
      Logger.error("error2")
      return false
    }
    if(!validate3(data)) {
      Logger.error("error3")
      return false
    }
  } catch {
    case e: Exception => {
      Logger.error(e.getMessage)
      return false
    }
  }
  true
}

Ответы [ 2 ]

0 голосов
/ 27 февраля 2019

Мы можем использовать cats.data.ValidatedNel (что в псевдониме для Validated[NonEmptyList[E], A]), что точно подходит для этого вида проверки:

import cats.data.ValidatedNel
import cats.implicits._

def validation(data: String): Validated[NonEmptyList[String], Boolean] = {

  def validateData1(data: String): ValidatedNel[String, Unit] = ???

  def validateData2(data: String): ValidatedNel[String, Unit] = ???

  def validateData3(data: String): ValidatedNel[String, Unit] = ???

  val data: String = ???

  val res: ValidatedNel[String, Unit] =
    validateData1(data) *>
      validateData2(data) *>
      validateData3(data)

  res.map(_ => true)
}

И затем:

validation("foo").toEither match {
  case Left(errors) => // log errors
  case Right(validation) => // Do whatever you want with the validated boolean
}
0 голосов
/ 27 февраля 2019

Я бы использовал Try, как показано ниже:

import scala.util.{Try, Success, Failure}

def validateData(data: String): Boolean = {
  def logErr(valid: Boolean, e: String): Boolean =
    if (valid) true else {
        Logger.error(e)
        false
      }

  Try(logErr(validate1(data), "error1") && 
      logErr(validate2(data), "error2") && 
      logErr(validate3(data), "error3")
    ) match {
      case Success(res) => res
      case Failure(ex)  =>
        Logger.error(ex)
        false
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...