Scala Slick值foreach不是

Scala Slick值foreach不是,scala,for-loop,foreach,slick,Scala,For Loop,Foreach,Slick,这是在Scala Play项目中,用于连接到MariaDB cat build.sbt ... jdbc, "org.mariadb.jdbc" % "mariadb-java-client" % "2.6.2", "com.typesafe.slick" %% "slick" % "3.3.2", ... class用户(tag:tag)扩展表[(…)](tag,“User

这是在Scala Play项目中,用于连接到MariaDB

cat build.sbt
...
jdbc,
"org.mariadb.jdbc" % "mariadb-java-client" % "2.6.2",
"com.typesafe.slick" %% "slick" % "3.3.2",
...
class用户(tag:tag)扩展表[(…)](tag,“Users”){…}
val users=TableQuery[users]

对于(u,看起来您希望迭代数据库中的用户

这里有几个您需要的概念:

  • 表达式
    users
    是一种查询。像
    map
    filter
    这样的方法是生成替代查询的一种方法。使用
    foreach
    对查询进行迭代实际上没有意义

  • 对于
    用户.results
    您有一个操作(一种
    DBIOAction
    )。这是您可以使用
    db.run
    发送到数据库的内容。同样,像
    map
    flatMap
    这样的方法是转换和组合动作的一种方式,但是使用
    foreach
    对动作进行迭代实际上没有意义

那么该怎么做呢?
用户的签名。result
类似于
DBIO[Seq[User]]]
。如果您想对每个用户做些什么,可以打印出来,您可以构造一个操作来完成。一种方法是
将操作的结果(用户列表)映射到其他内容。可能:

val doSomethingWithEachUser: DBIO[Unit] = 
  users.result.map { seqUsers => 
    seqUsers.foreach(println)
  }
这里我们使用
map
DBIO[Seq[User]]
的结果类型更改为
DBIO[Unit]

然后,您可以使用
db.run
doSomethingWithEchuser
发送到数据库(也就是说)。当您这样做时,您的操作将运行,并且当值可用时,将发生
println

要切换回a进行理解,您可以看到我们需要构建一个新动作:

val doSomethingWithEachUser: DBIO[Unit] =
  for {
    allUsers <- messages.result
  } yield allUsers.foreach(println)
val doSomethingWithEachUser:DBIO[单位]=
为了{

无需使用
yield
子句就可以使用
for
进行理解。foreach()
调用您的集合。如果您的集合不支持
foreach()
方法,则您必须使用不同的方法对集合进行迭代。
val doSomethingWithEachUser: DBIO[Unit] = 
  users.result.map { seqUsers => 
    seqUsers.foreach(println)
  }
val doSomethingWithEachUser: DBIO[Unit] =
  for {
    allUsers <- messages.result
  } yield allUsers.foreach(println)