2011-08-31 142 views
5

我使用Scala和JDBC,现在我想重复使用PreparedStatement来执行多重插入。我想在数组上使用foreach循环,但我无法用Scala解决它。如何在Scala中使用foreach循环来改变对象?

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

+0

难道你只是需要使用大括号('items foreach {...}')才能让多行块正确执行吗?如果没有,请解释**为什么**这是错误的(例如给出编译器错误消息,或者结果不正确的行为)。 –

+0

@Andrzej:我曾尝试在几个地方放置'{'和'}',但我无法用任何组合编译它。在这种情况下的错误是'错误提出是:')'预期,但'('found.' *在*'stmt.setInt↓(1,item.id)' – Jonas

+0

@Jones它看起来像是一个花括号问题;我已经添加了一个答案来证明这一点,如果你仍然看到问题,那么它可能是基于其他地方的逻辑错误,而不是Scala处理foreach循环的方式。 –

回答

19

如果您想将其解释为多语句(您这样做),则需要使用大括号作为参数foreach

除此之外,你在做什么看起来很好。这里就是我以同样的方式变异在foreach块中的对象(使用简单一个StringBuilder)一个REPL会话:

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; 

(而使用括号对f​​oreach块导致错误<console>:3: error: ')' expected but '.' found.

一般来说

val sb = new java.lang.StringBuilder 

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

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

,它被认为是更地道使用中缀形式收集操作,如map,012:

+0

@biesczadka我不确定我遵循:如果你想从函数返回它,那么只要确保它是你的函数的返回值!无论哪种方式,对于这个问题或我的答案都没有**,所以如果你仍然有问题,你应该把它作为一个单独的问题发布。 –

11

一个小点,但安德烈的回答可以通过使用中缀表示法更宽松清理,foreachfilter

+3

这个评论让我感到惊讶。以下是风格指南中的讨论: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'是一个突变,因此风格指南中说不使用中缀。 –

+1

风格指南就是这样一个*指南*。它包含准则(不是规则),它不是绝对的福音。你会发现在那里的一些建议的意见分歧,包括这一个:) –

+1

作为规则的一个明显的反例,分配方法'='是副作用的,但总是用中缀表示法。 –