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

Jon*_*nas 6 foreach scala jdbc 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()
    )
Run Code Online (Sandbox Code Playgroud)

items是一个包含多个的数组MyItem.

如何在Scala中编写这个foreach-loop并重用PreparedStatement

And*_*yle 20

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;
Run Code Online (Sandbox Code Playgroud)

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


Kev*_*ght 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)
}
Run Code Online (Sandbox Code Playgroud)

一般情况下,它被认为是更地道用于收集操作,如缀形式map,flatMap,foreachfilter

  • 这个评论让我感到惊讶.以下是样式指南中的讨论:http://davetron5000.github.com/scala-style/method_invocation/arity1/index.html和http://davetron5000.github.com/scala-style/method_invocation/arity1/higher_order_functions. html规则似乎是中缀符号应该*仅*用于不可变函数,并且最好使用更高阶的方法,例如`map`.由于`append`是一个变异,样式指南说不要使用中缀. (3认同)