gpt4 book ai didi

scala - 链接多个任意一个

转载 作者:行者123 更新时间:2023-12-02 09:24:09 26 4
gpt4 key购买 nike

考虑场景

trait Checker {
def check()(implicit ec: ExecutionContext): Future[Either[String, Unit]]
}

此特征由各个类实现。

可以说

    class CheckerImpl1 extends Checker {
override def check()(implicit ec: ExecutionContext): Future[Either[String, Unit]] = ???
}
class CheckerImpl2 extends Checker {
override def check()(implicit ec: ExecutionContext): Future[Either[String, Unit]] = ???
}

现在,我需要定义一个新函数,它将按顺序调用每个实现类的 check() 函数(顺序无关紧要)并返回一个新的函数,即 Future [Either[String, Unit]] 其中 String 是 check() 实现结果的 left 的串联字符串。

因此,如果 CheckerImpl1.check() 返回 Left("error1") 并且 CheckerImpl2.check() 返回 Left( "error2") 那么新函数的结果将返回 Left("error1&error2") (&只是分隔两个字符串)。

或者

因此,如果 CheckerImpl1.check() 返回 Right(()) 并且 CheckerImpl2.check() 返回 Left("error2") 那么新函数的结果将返回 Left("error2")

或者

因此,如果 CheckerImpl1.check() 返回 Right(()) 并且 CheckerImpl2.check() 返回 Right(( )) 那么新函数的结果将返回 Right(())

我现在所做的是

(CheckerImpl1.check(), CheckerImpl2.check())
.mapN {
case (Right(_), Right(_)) => Right(())
case (Left(err), Right(_)) => Left(err)
case (Right(_), Left(err)) => Left(err)
case (Left(err1), Left(err2)) => Left(err1 ++ "&" ++ err2)))
}

但这不是一个理想的解决方案,因为如果我添加更多实现,那么我将需要添加更多这些 case 语句。

有更好的方法吗?

最佳答案

所以你有一个列表,其中包含 future 任一

val lfe :List[Future[Either[String,Unit]]] = ???

要将所有 Left 字符串放在一个 Future[String] 中,您可以这样做...

val res :Future[String] =
Future.sequence(lfe)
.map(_.flatMap(_.fold(Some(_),_ => None)).mkString(" & "))

关于scala - 链接多个任意一个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60963301/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com