2011-08-31 12 views
5

Scala ve JDBC'yi kullanıyorum, şimdi çoklu ekleme yapmak için PreparedStatement'u yeniden kullanmak istiyorum. Bir foreach döngüsünü bir dizi üzerinde kullanmak istiyorum, ancak Scala ile doğru şekilde elde edemiyorum. Scala'da nesneyi değiştiren bir foreach döngüsü nasıl kullanılır?

val stmt = conn.prepareStatement(insertStatement) 

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

items

birden MyItem içeren bir dizidir.

Bu foreach döngüsünü Scala'ya nasıl yazabilirim ve PreparedStatement'u yeniden kullanabilir miyim?

+0

Çok satırlı bir bloğun düzgün bir şekilde yürütülmesi için kaşlı ayraçlar (foreach {...}}) kullanmanız yeterli olabilir mi? Değilse, lütfen ** neden ** yanlış olduğunu açıklayın (ör., Derleyici hata iletisini veya sonuçların yanlış davranışını verin). –

+0

@Andrzej: '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' 'ı'''''nı koymaya çalıştım ama herhangi bir kombinasyonla derlenemiyorum Bu durumda hata, 'Hatalandı:') 'beklenen' ancak '(' found.' * 'da * stmt.setInt ↓ (1, item.id) ' – Jonas

+0

@Jones bir küme ayracı sorunu gibi görünüyor Bunu gösteren bir yanıt ekledim, eğer hala problem görüyorsanız, muhtemelen Scala'nın foreach döngülerinden ziyade mantıksal bir hataya dayandığını tahmin ediyorum. –

cevap

19

Sen bunu bir çok açıklamada (yaptığın) blok olarak yorumlanabilir istiyorsanız foreach için argüman için küme parantezi kullanmak gerekir.

Bununla ilgili olarak, yaptığınız şey iyi görünüyor.

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 blok için parantez Ve kullanarak hatanın <console>:3: error: ')' expected but '.' found. yöneltir): İşte benzer şekilde bir foreach bloğundaki bir nesne mutasyona (basitlik için bir StringBuilder kullanarak) olduğum bir REPL oturumu var
+0

@biesczadka Takip ettiğimden emin değilim: Eğer bir fonksiyondan geri dönmek istiyorsanız, o zaman fonksiyonunuzun geri dönüş değeri olduğundan emin olun! Her iki durumda da, bu soruyla ya da cevabımla ** bir alakası yoktur, bu yüzden hala sorunlarınız varsa bunu ayrı bir soru olarak göndermelisiniz. –

11

küçük bir nokta, ama Andrzej cevabı daha liberal infix gösterimi kullanılarak tarafından temizlenebilir:

val sb = new java.lang.StringBuilder 

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

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

Genel olarak, toplama işlemleri gibi map 012 için infix formunu kullanmak daha deyimsel kabul edilir, foreach ve filter

+3

Bu yorum beni şaşırtıyor. İşte buradaki stil rehberi tartışması: http://davetron5000.github.com/scala-style/method_invocation/arity1/index.html ve http://davetron5000.github.com/scala-style/method_invocation/arity1/higher_order_functions. html Kural, infix gösteriminin * olması gerektiği gibi görünüyor * sadece immutable işlevler için kullanılır ve tercihen "map" gibi daha yüksek mertebeden yöntemlerle kullanılır. “Ek” bir mutasyon olduğundan, stil rehberi infix kullanmadığını söylüyor. –

+1

Stil kılavuzu sadece bir * kılavuz *. Kurallar (kurallar değil) içerir ve mutlak müjde değildir.Orada da dahil olmak üzere bazı önerilere ilişkin görüş farklılıkları bulacaksınız :) –

+1

Kural için açık bir karşı örnek olarak, atama yöntemi, = =, yan etki, ancak infix gösteriminde her zaman kullanılır. –