Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
List 将集合列表缩减为单值单位_List_Scala_Reduce - Fatal编程技术网

List 将集合列表缩减为单值单位

List 将集合列表缩减为单值单位,list,scala,reduce,List,Scala,Reduce,我必须输入一个类型为List[Unit]的值,我可以做些什么来将其减少为Unit def insertMany(users: List[User]) : IO[Unit] = lines.map(line => createorUpdate(user)) .transact(xa) def createorUpdate(user: User): ConnectionIO[Unit] = sql""" INS

我必须输入一个类型为
List[Unit]
的值,我可以做些什么来将其减少为
Unit

 def insertMany(users: List[User]) : IO[Unit] =
    lines.map(line => createorUpdate(user))
      .transact(xa)


def createorUpdate(user: User): ConnectionIO[Unit] =
    sql"""
          INSERT INTO $tableName ($columns)
          VALUES (${user.id}, ${user.age}, NOW(), NOW())
          ON CONFLICT DO NOTHING"""
      .update.run
      .map(_ => ())
以下是完整的定义 我得到一个错误:

value transact is not a member of List[doobie.ConnectionIO[Unit]]
                       [error] possible cause: maybe a semicolon is missing before `value transact'?
                       [error]       .transact(xa)
                       [error]        ^
                       [error] one error found

听起来你在寻找
[updateMany][1]
但有时候这根本不起作用

如果您试图使现有代码正常工作,则需要对IO应用
transact

所以它必须是这样的:

def insertMany(lines: List[String]) : IO[Unit] =
    lines.map(line => createorUpdate(line)).sequence_.transact(xa)
sequence
基本上从List[IO[您的类型]]更改为IO[List[您的类型]]

当您有
映射
序列
时,您总是可以转换为
遍历
,因此这也会起作用

def insertMany(lines: List[String]) : IO[Unit] =
  lines.traverse_(line => createorUpdate(line)).transact(xa)

把它扔掉,然后把单位还给我?只有1个单位值,所以不需要对列表做任何事情,除非您需要对列表中的每个元素执行一些副作用。然后你就开始做list.foreach(=>/*一些副作用*/)你为什么还要做呢?首先,您是如何获得单元列表的,将单元用作返回类型不是一种好的做法。这就是使用严格类型语言的全部意义。您可以使用
ioList.void
来丢弃单元;不过,如果您使用的是fs2.Stream而不是
.compile.toList
,那么您可能应该更早地使用它,比如used
.compile.drain
,您可以添加一个示例吗?我猜您需要
序列
遍历
,因为您正在谈论IOs的doobie