【问题标题】:Returning the same value type, but with success/failure返回相同的值类型,但有成功/失败
【发布时间】:2015-03-28 13:15:44
【问题描述】:

假设我有一个方法..

def foo(b: Bar): Try[Bar] = ???

Try 在这里只是一个占位符。 fooBar 执行操作,然后返回一个值来指示成功/失败。我想返回带有成功/失败指示的原始值,所以当我有一个集合时,我可以知道 哪些 失败和成功,并对它们进行处理。 Try 对我不起作用,因为 Failure 包装了一个异常(假设我不关心它失败的原因)。

我可能会返回Either[Bar, Bar],但重复类型参数似乎是多余的。

还有比这更好的选择吗?

【问题讨论】:

  • 你想在成功时返回值,还是在失败时返回?
  • 你可以返回(布尔值,条形)
  • 成功和失败,所以我可以准确收集哪些值成功,哪些值失败。
  • 如果两者都需要,可以返回(Bar, Try[Bar])

标签: scala


【解决方案1】:

Either[Bar, Bar](Boolean, Bar) 是同构的,它们之间的选择是个人喜好问题。

我个人更喜欢Either,因为您可以获得一组更好的操作,用于通过模式匹配等对集合进行映射,以及merge 扩展方法,允许您编写results.map(_.merge) 来获取Seq[Bar] 如果在某些情况下您不再需要区分成功和失败的结果。我也发现了这个:

val result: Either[Bar, Bar] = foo(input).toOption.toRight(input)

比:更好一点:

val result: (Boolean, Bar) =
  foo(input).map((true, _)).getOrElse((false, input))

或其他选择,但您的里程可能会有所不同。

【讨论】:

  • 请注意,Either[Bar, Bar](Boolean, Bar) 同构意味着您始终可以将任一类型的实例转换为另一种类型。
【解决方案2】:

如果我理解您的问题:您的解决方案几乎就是您将要实现的目标。

def foo(b: Bar): Try[Bar] = Try(...)
val succeed = foo(b).getOrElse()

成功中,你有你想要的价值,或者什么也没有(因为你不关心异常)。很好的文章是:http://danielwestheide.com/blog/2012/12/26/the-neophytes-guide-to-scala-part-6-error-handling-with-try.html

【讨论】:

    猜你喜欢
    • 2019-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-13
    • 1970-01-01
    • 1970-01-01
    • 2019-08-20
    • 2013-11-07
    相关资源
    最近更新 更多