2011-08-31 36 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

作爲規則的一個明顯的反例,分配方法'='是副作用的,但總是用中綴表示法。 –