将集合列表缩减为单值单位
Reduce a Collection List to single value Unit
我必须使用 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]
,但有时这行不通。
如果您想让您的代码正常工作,您需要将 transact
应用到 IO
所以它必须是这样的:
def insertMany(lines: List[String]) : IO[Unit] =
lines.map(line => createorUpdate(line)).sequence_.transact(xa)
sequence
基本上从 List[IO[your_type]] 变为 IO[List[your_type]]...
当您有 map
和 sequence_
时,您总是可以转换为 traverse
,所以这也可以工作
def insertMany(lines: List[String]) : IO[Unit] =
lines.traverse_(line => createorUpdate(line)).transact(xa)
我必须使用 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]
,但有时这行不通。
如果您想让您的代码正常工作,您需要将 transact
应用到 IO
所以它必须是这样的:
def insertMany(lines: List[String]) : IO[Unit] =
lines.map(line => createorUpdate(line)).sequence_.transact(xa)
sequence
基本上从 List[IO[your_type]] 变为 IO[List[your_type]]...
当您有 map
和 sequence_
时,您总是可以转换为 traverse
,所以这也可以工作
def insertMany(lines: List[String]) : IO[Unit] =
lines.traverse_(line => createorUpdate(line)).transact(xa)