我有一个具有OptionPath类型字段的功能,然后该字段的数据类型更改为OptionString。我想在不使用匹配的情况下重写这个功能,这样可以吗?
samplePath: OptionPath过去的样子
samplePath.fold(new File(getResource("sample").getPath))(_.toFile)使用samplePath的方式: OptionString
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)发布于 2020-01-14 08:59:28
最天真的解决方案是.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抛出,我们将得到一个带有Exception的Left。
也许更好的做法是消除Option[String]输入--需要传递一个严格的String,这有助于我们避免冗余的Option[Path]包装器,并返回一个直接的Path对象,以防我们成功地构建它:
def transformToPath(path: String): Either[Throwable, Path] =
Try(Paths.get(path)).toEither现在,在调用此方法之前,需要通过OptionString` `调用外部调用方.map:
val result = Option(someStringFromJavaLand).map(transformToPath)https://stackoverflow.com/questions/59729858
复制相似问题