我们说我有方法..
def foo(b: Bar): Try[Bar] = ???
Try
只是一个占位符。 foo
对Bar
执行某些操作,然后返回一个值以指示成功/失败。我想用成功/失败指示返回原始值,所以当我有一个集合时,我可以知道哪些失败并成功,并对它们做了些什么。 Try
并不适合我,因为Failure
包含了一个例外(让我们说我不关心它失败的原因)。
我可以返回Either[Bar, Bar]
,但重复类型参数似乎是多余的。
有比这更好的选择吗?
答案 0 :(得分:3)
Either[Bar, Bar]
和(Boolean, Bar)
是同构的,它们之间的选择只是一种品味。
我个人更喜欢Either
,因为您可以通过模式匹配等获得更好的映射集合的操作,以及允许您编写的merge
扩展方法{如果在某些情况下您不再需要区分成功和失败的结果,则{1}}获得results.map(_.merge)
。我也发现了这个:
Seq[Bar]
比......更好:
val result: Either[Bar, Bar] = foo(input).toOption.toRight(input)
或替代方案,但您的里程可能会有所不同。
答案 1 :(得分:-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