如何在Scala中使用改变对象的foreach循环?

时间:2011-08-31 07:41:38

标签: scala jdbc foreach prepared-statement

我使用Scala和JDBC,现在我想重用PreparedStatement来进行多插入。我想在数组上使用foreach-loop,但是我无法使用Scala。

val stmt = conn.prepareStatement(insertStatement)

// wrong Scala
items.foreach(item : MyItem =>
    stmt.setInt(1, item.id)
    stmt.setInt(2, item.value)
    stmt.executeUpdate()
    )

items是一个包含多个MyItem

的数组

如何在Scala中编写此foreach循环并重用PreparedStatement

2 个答案:

答案 0 :(得分:19)

如果您希望将大括号解释为多语句(您可以这样做),则需要使用大括号作为foreach的参数。

除此之外,你正在做的事看起来很好。这是一个REPL会话,我以类似的方式改变foreach块中的对象(为简单起见,使用StringBuilder):

scala> val sb = new java.lang.StringBuilder
sb: java.lang.StringBuilder =

scala> val items = List("tinker", "tailor", "soldier", "spy")
items: List[java.lang.String] = List(tinker, tailor, soldier, spy)

scala> items.foreach { item =>
     |   sb.append(item)
     |   sb.append("; ")
     |   println(sb)
     | }
tinker;
tinker; tailor;
tinker; tailor; soldier;
tinker; tailor; soldier; spy;

(使用foreach块的括号会导致错误<console>:3: error: ')' expected but '.' found.

答案 1 :(得分:11)

小点,但Andrzej的回答可以通过更加自由地使用中缀符号来清理:

val sb = new java.lang.StringBuilder

val items = List("tinker", "tailor", "soldier", "spy")

items foreach { item =>
  sb append item
  sb append "; "
  println(sb)
}

通常,使用中缀表单进行收集操作(例如mapflatMapforeachfilter

会更加惯用