将选项[字符串] 转换为选项[路径]

Convert Option[String] to Option[Path]

我有一个字段类型为 Option[Path] 的功能,然后该字段的数据类型更改为 Option[String]。 我想在不使用匹配的情况下重写此功能,是否可以这样做?

它以前看起来像 samplePath 的方式:Option[Path]

samplePath.fold(new File(getResource("sample").getPath))(_.toFile)

samplePath 的样子:Option[String]

  def transformToPath(path: Option[String]): Option[Path] = {
    path match {
      case Some(st) => Some(Paths.get(st))
      case None => None
    }
  }

transformToPath(samplePath).fold(new File(getResource("sample").getPath))(_.toFile)

最天真的解决方案是 .map 路径:

def transformToPath(path: Option[String]): Option[Path] =
   path.map(path => Paths.get(path))

更好的方法是用 Try[A]:

包裹内部表达式
def transformToPath(path: Option[String]): Option[Path] =
   path.flatMap(path => Try(Paths.get(path)).toOption)

请注意,这不会表示 Paths.get 中发生了错误(可能会引发异常)。理想情况下,我们还应该将其传播给调用者:

def transformToPath(path: Option[String]): Either[Throwable, Option[Path]] =
  path.fold[Either[Throwable, Option[Path]]](Right(None))(
    path => Try(Paths.get(path)).map(Option(_)).toEither
  )

现在,如果 Paths.get 抛出,我们会得到 LeftException

也许更好的方法是消除 Option[String] 输入并要求传入严格的 String,这有助于我们避免冗余的 Option[Path] 包装器和 return一个直接的 Path 对象,以防我们成功构造它:

def transformToPath(path: String): Either[Throwable, Path] =
  Try(Paths.get(path)).toEither

现在,这将需要外部调用者 .map 在调用此方法之前通过 Option[String]`:

val result = Option(someStringFromJavaLand).map(transformToPath)