有 3 个方法返回 Either,必须按顺序调用,如果前一个返回 Right。只应返回最后一个 Either 的结果。如何正确处理它们,以免在发生错误的情况下丢失Left,并且没有像Either[Either[Either...]]]这样的嵌套。
def doSmth1: Either[Exception, String] = {}
def doSmth2: Either[Exception, String] = {}
def doSmth3: Either[Exception, String] = {}
试图这样处理:
doSmth1.map(s1 => {/** do something */
doSmth2.map({
doSmth3.map({
//do something
})
})
})
但是嵌套是Either[Either[Either...]]]。可以通过 for 理解处理:
for (
s1 <- doSmth1
s2 <- doSmth2
s3 <- doSmth3
) yield
如何在没有嵌套的情况下计算 Either?
为避免嵌套,您可以使用
Either.flatten
.更好的是,一种结合
map
和flatten
当使用以下构造时,编译器将生成大约这样的代码
对于您的情况,何时
s1
和s2
不重要,但s3
使用不变,我们通过应用相同的转换获得以下表达式您可以选择任何选项,但由于其简单性,我会坚持理解。