首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将Option[String]转换为Option[Path]

将Option[String]转换为Option[Path]
EN

Stack Overflow用户
提问于 2020-01-14 08:20:21
回答 1查看 212关注 0票数 1

我有一个具有OptionPath类型字段的功能,然后该字段的数据类型更改为OptionString。我想在不使用匹配的情况下重写这个功能,这样可以吗?

samplePath: OptionPath过去的样子

代码语言:javascript
复制
samplePath.fold(new File(getResource("sample").getPath))(_.toFile)

使用samplePath的方式: OptionString

代码语言:javascript
复制
  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)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-01-14 08:59:28

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

代码语言:javascript
复制
def transformToPath(path: Option[String]): Option[Path] =
   path.map(path => Paths.get(path))

更好的方法是用Try[A]包装内部表达式。

代码语言:javascript
复制
def transformToPath(path: Option[String]): Option[Path] =
   path.flatMap(path => Try(Paths.get(path)).toOption)

请注意,这不会指示在Paths.get中发生错误(这会引发异常)。理想情况下,我们还应该向调用方传播这一点:

代码语言:javascript
复制
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抛出,我们将得到一个带有ExceptionLeft

也许更好的做法是消除Option[String]输入--需要传递一个严格的String,这有助于我们避免冗余的Option[Path]包装器,并返回一个直接的Path对象,以防我们成功地构建它:

代码语言:javascript
复制
def transformToPath(path: String): Either[Throwable, Path] =
  Try(Paths.get(path)).toEither

现在,在调用此方法之前,需要通过OptionString` `调用外部调用方.map

代码语言:javascript
复制
val result = Option(someStringFromJavaLand).map(transformToPath)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59729858

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档