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