首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Scala的未来和转型

Scala的未来和转型
EN

Stack Overflow用户
提问于 2020-06-10 05:37:21
回答 1查看 45关注 0票数 0

我有一个类型为

代码语言:javascript
复制
val input: Future[Seq[Either[ErrorClass, Seq[WidgetCampaign]]]] = ???

我希望遍历此输入并删除所有重复的WidgetCampaign,并将输出返回为

代码语言:javascript
复制
val result: Future[Either[ErrorClass,Set[WidgetCampaign]]] = ???

我如何才能做到这一点?

EN

回答 1

Stack Overflow用户

发布于 2020-06-10 06:16:05

首先,可以使用map调用在Future中完成所有处理:

代码语言:javascript
复制
input.map(process)

所以问题是要编写一个在Seq[Either[ErrorClass, Seq[WidgetCampaign]]Either[ErrorClass, Set[WidgetCampaign]]之间进行转换的process函数。

首先创建几个类型别名,以使代码的其余部分更加简洁。

代码语言:javascript
复制
type InType = Either[ErrorClass, Seq[WidgetCampaign]]
type OutType = Either[ErrorClass, Set[WidgetCampaign]]

这个过程本身可以通过一个笨拙的flatMap调用来完成,但是一个简单的递归函数可能是最好的:

代码语言:javascript
复制
def process(input: Seq[InType]): OutType = {
  @annotation.tailrec
  def loop(rem: List[InType], res: Set[WidgetCampaign]): OutType =
    rem match {
      case Nil => // Stop when no more elements to process
        Right(res)
      case Left(e) :: _ => // Stop on first error
        Left(e)
      case Right(s) :: tail => // Add this Seq to the result and loop
        loop(tail, res ++ s)
    }

  loop(input.toList, Set.empty[WidgetCampaign])
}

这是递归逻辑的标准模式,其中递归函数本身被包装在外部函数中。为了提高效率,内部函数是尾递归的,中间结果通过递归调用向下传递。

输入被转换为List以使模式匹配变得更容易。

这是未经测试的,但它可以编译,所以这是一个开始...

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62292283

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档