将选项[字符串] 转换为选项[路径]
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
抛出,我们会得到 Left
和 Exception
。
也许更好的方法是消除 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)
我有一个字段类型为 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
抛出,我们会得到 Left
和 Exception
。
也许更好的方法是消除 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)