Scala 将选项[String]转换为选项[Path]

Scala 将选项[String]转换为选项[Path],scala,path,option,Scala,Path,Option,我有一个Option[Path]类型字段的功能,然后该字段的数据类型更改为Option[String]。 我想在不使用匹配的情况下重写此功能,是否可以这样做 使用samplePath:Option[Path] samplePath.fold(new File(getResource("sample").getPath))(_.toFile) def transformToPath(path: Option[String]): Option[Path] = { path match

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

使用samplePath:Option[Path]

samplePath.fold(new File(getResource("sample").getPath))(_.toFile)
  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)
使用samplePath:Option[String]

samplePath.fold(new File(getResource("sample").getPath))(_.toFile)
  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)
请注意,这不会表示路径中发生错误。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
抛出,我们将得到一个
和一个
异常

也许更好的方法是取消
选项[String]
输入,要求传入严格的
字符串
,这有助于我们避免冗余的
选项[Path]
包装器,并在我们成功构建它的情况下返回直接的
路径
对象:

def transformToPath(path: String): Either[Throwable, Path] =
  Try(Paths.get(path)).toEither
现在,在调用此方法之前,需要外部调用者在选项[String]`上
.map

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

samplePath.flatMap(str=>Try(path.get(str)).toOption.fold(…
如果我不需要抛出异常怎么办?也有字符串返回null的情况,这就是我使用option@Cassie您实际上并没有抛出异常,而是
路径。get
可能会抛出异常。如果不需要,可以使用我向您展示的第一个选项。