【问题标题】:How to FlatMap Option while Preserving When Empty空时如何保留 FlatMap 选项
【发布时间】:2018-04-04 18:11:29
【问题描述】:

我想对选项转换进行平面映射,同时了解转换“退出”的位置(即首次返回 None 的位置)。

一些示例代码:

val stringFetcher : DomainObject=>Option[String] = ...

val filterer : String=>Option[String] = ...

val reportFilteredCause: DomainObject => String = do =>
{
   val strOption = stringFetcher(do)
   val filterReasonOption = strOption flatMap filterer
   filterReasonOption.getOrElse("Failed to fetch string representation OR field not filtered")
}

理想情况下,我想写一些类似下面的东西,我传入一些与每个选项转换相关的报告字符串:

val stringFetcher : DomainObject=>Option[String] = ...

val filterer : String=>Option[String] = ...

val reportFilteredCause: DomainObject => String = do =>
{
   val strOption : Either[Option[String], String]] = EitherWrapper stringFetcher(do) "Failed to fetch string representation"
   val filterReasonOption = strOption flatMapWrapper filterer "Failed to filter field
   filterReasonOption
}

【问题讨论】:

  • stringFetchergetStringRepr是什么关系?看起来他们做同样的事情。为什么一个已定义但未使用,而另一个已使用但未定义?
  • stringFetcherfilterer 只是我想要应用到DomainObject 的两个操作(按它们各自的顺序!)。我用... 代替了定义——它们都应该被使用和定义
  • 重新阅读我的问题(和您的代码)。为什么 stringFetcher 定义但从未使用过?为什么代码中使用了getStringRepr,却没有定义?
  • 已修复;)谢谢

标签: scala functional-programming optional either


【解决方案1】:

我认为您想要的是Either[String,String],其中左侧投影是失败消息,右侧投影是结果字符串。

val reportFilteredCause :DomainObject => String = { dob :DomainObject =>

  val strOption :Either[String, String] =
    stringFetcher(dob).toRight("Failed to fetch string representation")

  val filterReasonOption :Either[String,String] =
    strOption.flatMap(filterer(_).toRight("Failed to filter field"))

  filterReasonOption.fold(identity,identity)
}

.toRight() 方法将Option 转换为Either

Some(x).toRight(y) //x.right
None.toRight(y)    //y.left

尽管事实上,使用fold()getOrElse() 可能更容易、更清晰。

val reportFilteredCause :DomainObject => String = {
  stringFetcher(_).fold("Failed to fetch string representation"){
   filterer(_).getOrElse("Failed to filter field")
  }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-10
    • 1970-01-01
    • 1970-01-01
    • 2021-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-01
    相关资源
    最近更新 更多