Как правильно использовать scala типов Either или Option - PullRequest
0 голосов
/ 23 апреля 2020

Я новичок ie в scala. И я понимаю, что scala не рекомендуется использовать try, catch, finally block. Скорее это продвигает типы Option, Try и Either`.

Я хочу понять, как правильно их использовать в следующем случае.

Функция для чтения файла свойств

  def getSourcePath(properties: Properties): Path = {
    val dataFileURI: String = properties.getProperty("dataFileURI")
    val srcPath = new Path(dataFileURI)
    srcPath
  }

Функция, которая использует значение из getSourcePath

  val srcPath = getSourcePath(properties)
  def getDataFileName(srcPath: Path, auditID: String): String = {
    val dataFileName: String = srcPath.getName + "_" + auditID
    dataFileName
  }

GetSourcePath, который возвращает Either


  def getSourcePath(properties: Properties): Either[FileSystemError, Path] = {
    try{
      val dataFileURI: String = properties.getProperty("dataFileURI")
      val srcPath = new Path(dataFileURI)
      Right(srcPath)  
    }catch{
      case exception: Exception => Left(FileSystemError("Not able to get dataFileURI"))
    }

getDataFileName для использования Either.

def getDataFileName(srcPath: Either[FileSystemError, Path], auditID: String): Either[FileSystemError, String] = {
    srcPath match {
      case Right(srcPath) => Right(srcPath.getName + "_" + auditID)
      case Left(srcPath) => Left(srcPath)
    }
  }

Однако, это похоже на передачу исключения далее в методах. И выполнение сопоставления с шаблоном для каждого аргумента выглядит излишним, если у меня есть 3-4 аргумента.

Похоже, я не до конца понимаю эти типы.

1 Ответ

2 голосов
/ 23 апреля 2020

Вот как бы я написал код. Я бы использовал монаду Try, потому что она самая краткая. Либо тоже работает, но вы должны использовать явный тип ошибки, и это делает вещи более подробными. Поэтому я бы придерживался Try.

def getSourcePath(properties: Properties): Try[Path] = 
  Try(new Path(properties.getProperty("dataFileURI")))

def getDataFileName(srcPath: Try[Path], auditID: String): Try[String] = 
  srcPath.map(_.getName + "_" + auditID)

Если вы хотите преобразовать в Option, вызовите toOption для монады Try, возвращаемой любой из функций.

Если у вас есть вопросы по поводу как работает код, могу ответить в разделе комментариев

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...