Как использовать цикл foreach в Scala, который мутирует объект? - PullRequest
6 голосов
/ 31 августа 2011

Я использую Scala и JDBC, теперь я хочу повторно использовать PreparedStatement для мульти-вставки. Я хочу использовать цикл foreach над массивом, но не могу сделать это правильно с помощью 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.

Как мне написать этот цикл foreach в Scala и повторно использовать PreparedStatement?

Ответы [ 2 ]

20 голосов
/ 31 августа 2011

Вам необходимо использовать фигурные скобки для аргумента foreach, если вы хотите, чтобы он интерпретировался как мульти-оператор block (что вы делаете).

Помимо этогоТо, что вы делаете, выглядит хорошо.Вот сеанс 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.)

11 голосов
/ 31 августа 2011

Небольшое замечание, но ответ Анджея можно очистить, используя более широкое обозначение инфиксной записи:

val sb = new java.lang.StringBuilder

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

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

Обычно считается более идиоматичным использовать инфиксную форму для таких операций сбора, как map,flatMap, foreach и filter

...