如果我有一个返回Either
的方法
def myMethod(s: String): Either[List[SomethingElse], Color] = {
....
}
我有一个这样的案例类:
case class ColorShade (color: Color, shade: Shade = Shade())
如何从Color
返回myMethod
并将其分配给color
中的ColorShade
。以下无效:
Color(Right(myMethod(someString)))
答案 0 :(得分:0)
如果您不关心其他任何事情,并且对引发异常的风险感到满意,则可以执行以下操作:
ColorShade(myMethod("someString").toOption.get)
但是,这不是惯用方法,也不是推荐的方法。
如果您可以考虑合理的默认值,则可以执行以下操作:
val defaultColor : Color = ???
ColorShade(myMethod("someString").getOrElse(defaultColor))
最惯用的方法可能是更改使用ColorShade
来接受Either[List[SomethingElse], ColorShade]
的内容。这样做的好处是,在Left
的情况下,您可以保留信息(也许出于错误记录的目的)。为此,您可以执行以下操作:
myMethod("someString").map(color => ColorShade(color))
这将是Either[List[SomethingElse], ColorShade]
类型。另外,如果您不需要Left
信息,则可能仍想执行toOption
将其转换为Option[ColorShade]
。
答案 1 :(得分:0)
通常要做的是在其上进行映射,以使最终结果也为Either:
myMethod(someString).right.map(c => ColorShade(c, someShade))
这将返回Either[List[SomethingElse], ColorShade]
。
注意:从Scala 2.12开始,您可以删除.right
部分,因为Either现在是右偏的。
答案 2 :(得分:0)
由于Either
是右偏的,因此您可以这样做。
myMethod("string").map(ColorShade(_, shadeValue))
结果为Either[List[SomethingElse],ColorShade]
。
使用fold
可能更惯用,您可以在其中指定myMethod()
返回Left
时发生的情况。
myMethod("string").fold(se => /*do something with the SomethingElse list*/
, ColorShade(_, shadeValue))