变换和展平分离列表

时间:2015-04-09 21:25:08

标签: scala scalaz

case class Errs(errors: List[Err]) 
case class Err(exceptionMessage: String, customMessage: String, statusCode: Int, extraInfo: Option[String] = None)

返回val result = List[\/[Errs, Boolean]]

的其中一个函数

为了变换/排序和展平result以下传递

val finalRes: \/[Errs, Boolean] = result.map(_.swap).sequenceU.map(x => Errs(x.map(_.errors).flatten)).swap

这看起来不够优雅且性能密集(给定通过多次map次呼叫的通过次数等)

scalaz中是否有一个组合器,可以通过较少的传递次数使这更优雅,或者这需要编写自定义函数?

1 个答案:

答案 0 :(得分:0)

首先,按照Travis Brown的建议使用traverseU

之后,拨打map后拨打flatten的电话可以使用flatMap写一次。

val finalRes: \/[Errs, Boolean] = result.traverseU(_.swap).map(x => Errs(x.flatMap(_.errors))).swap

此外,您可以考虑使用Errs的类型别名。

type Errs = List[Err]

因此,代码更简单(减少装箱/拆箱):

val finalRes: \/[Errs, Boolean] = result.traverseU(_.swap).map(_.flatten).swap