首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将List[zio.Task[List[A]转换为zio.Task[[List[A]] ]

如何将List[zio.Task[List[A]转换为zio.Task[[List[A]] ]
EN

Stack Overflow用户
提问于 2022-03-16 12:55:24
回答 2查看 501关注 0票数 2

我需要处理一组Ids并以zio.Task[ListRelevantReadingRow]的形式返回结果

代码语言:javascript
复制
def getBaselinesForRequestIds(baseLineReqIds: Set[String]): Task[List[RelevantReadingRow]] =
  dynamoConnection
    .run(
      table.getAll("baseline_req_id" in baseLineReqIds)
    )
    .flatMap(_.toList.separate match {
      case (err :: _, _)           => ZIO.fail(new Throwable(describe(err)))
      case (Nil, relevantReadings) => ZIO.succeed(relevantReadings)
    })

上面的代码可以工作,但我需要将它们作为mutch处理成25个元素的批次。我试过了,但是我得到了一个zio.Task列表

代码语言:javascript
复制
def getBaselinesForRequestIds(baseLineReqIds: Set[String]): Task[List[RelevantReadingRow]] = {
    val subSet = baseLineReqIds.grouped(25).toList
    val res = for {
      rows <- subSet.map(reqIds => dynamoConnection
        .run(
          table.getAll("baseline_req_id" in reqIds)
        ).flatMap(e => e.toList.separate match {
        case (err :: _, _) => ZIO.fail(new Throwable(describe(err)))
        case (Nil, relevantReadings) => ZIO.succeed(relevantReadings)
      }))
    } yield rows
    res // this is List[zio.Task[List[RelevantReadingRow]]]
  } 

我不知道如何转换回zio.Task[ListRelevantReadingRow]

有服用吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-03-16 19:24:45

你可以用ZIO.collectAll把ListTask转换成TaskList,我以为是ZIO.sequence.也许我被猫弄糊涂了.

下面的示例适用于Zio2

代码语言:javascript
复制
package sample

import zio._

object App extends ZIOAppDefault {
  case class Result(value: Int) extends AnyVal

  val data: List[Task[List[Result]]] = List(
    Task { List(Result(1), Result(2)) },
    Task { List(Result(3)) }
  )

  val flattenValues: Task[List[Result]] = for {
    values <- ZIO.collectAll { data }
  } yield values.flatten

  val app = for {
    values <- flattenValues
    _      <- Console.putStrLn { values }
  } yield()

  def run = app
}

特别是你的样本..。假设“分离”只是收集一些错误的扩展方法(返回错误列表和结果列表的元组),忽略方法“描述”将错误转换为可抛出的错误

https://scastie.scala-lang.org/jgoday/XKxVP2ECSFOv4chgSFCckg/7

代码语言:javascript
复制
package sample

import zio._


object App extends ZIOAppDefault {
  class DynamoMock {
    def run: Task[List[RelevantReadingRow]] = Task {
      List(
        RelevantReadingRow(1),
        RelevantReadingRow(2),
      )
    }
  }

  case class RelevantReadingRow(value: Int) extends AnyVal

  implicit class ListSeparate(list: List[RelevantReadingRow]) {
    def separate: (List[String], List[RelevantReadingRow]) =
      (Nil, list)
  }

  def getBaselinesForRequestIds(baseLineReqIds: Set[String]): Task[List[RelevantReadingRow]] = {
    val dynamoConnection = new DynamoMock()
    val subSet = baseLineReqIds.grouped(25).toList
    val res: List[Task[List[RelevantReadingRow]]] = for {
      rows <- subSet.map(reqIds => dynamoConnection
        .run.flatMap(e => e.toList.separate match {
          case (err :: _, _) => ZIO.fail(new Throwable(err))
          case (Nil, relevantReadings) => ZIO.succeed(relevantReadings)
        }))
    } yield rows

    for {
      rows <- ZIO.collectAll(res)
    } yield rows.flatten
  }

  val app = for {
    values <- getBaselinesForRequestIds(Set("id1", "id2"))
    _      <- Console.putStrLn { values }
  } yield()

  def run = app
}
票数 3
EN

Stack Overflow用户

发布于 2022-03-16 21:25:50

因此,这里有一个基于@jgoday答案的替代解决方案

代码语言:javascript
复制
def getBaselinesForRequestIds(baseLineReqIds: Set[String]): Task[List[RelevantReadingRow]] =
    for {
      values <- ZIO.foreachPar(baseLineReqIds.grouped(25).toList) {
        reqIds =>
          dynamoConnection
            .run(
              table.getAll("baseline_req_id" in reqIds)
            ).flatMap(e => e.toList.separate match {
            case (err :: _, _) => ZIO.fail(new Throwable(describe(err)))
            case (Nil, relevantReadings) => ZIO.succeed(relevantReadings)
          })
      }
    } yield values.flatten
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71497480

复制
相关文章

相似问题

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