2010-04-25 3 views
34

Jak scala.collection.JavaConversions supercede odpowiedzi udzielone w przepełnienie stosu pytanie Iterating over Java collections in Scala (to nie działa, ponieważ „JCL” pakiet nie ma) iw Iterating over Map with Scala (nie działa na mnie w skomplikowanych testów, które ja spróbuję zagłębić się i zamieścić tutaj później).Jaki jest nowy sposób na iteracje na mapie Java w Scala 2.8.0?

To ostatnie jest właściwie pytaniem Scala Map, ale myślę, że muszę znać obie odpowiedzi, aby powtórzyć próbkę ponad java.util.Map.

Odpowiedz

74

W 2.8, importujesz scala.collection.JavaConversions._ i używasz jako mapy Scala. Oto przykład (w 2.8.0.RC1):

scala> val jmap:java.util.Map[String,String] = new java.util.HashMap[String,String] 
jmap: java.util.Map[String,String] = {} 

scala> jmap.put("Hi","there") 
res0: String = null 

scala> jmap.put("So","long") 
res1: String = null 

scala> jmap.put("Never","mind") 
res2: String = null 

scala> import scala.collection.JavaConversions._ 
import scala.collection.JavaConversions._ 

scala> jmap.foreach(kv => println(kv._1 + " -> " + kv._2)) 
Hi -> there 
Never -> mind 
So -> long 

scala> jmap.keys.map(_.toUpperCase).foreach(println) 
HI 
NEVER 
SO 

Jeśli konkretnie chcesz iterator Scala, użyj jmap.iterator (po konwersji importu).

+0

Wow, to wspaniałe, bezbolesne rozwiązanie! – rasen58

+0

Powinien istnieć sposób bez konwersji na mapę scala, prawda? Lepiej będzie, jeśli będziemy wykonywać iterację nad mapą java w pętli, pozwoli to uniknąć niepotrzebnego tworzenia obiektów. Getting "found: (String, String) => Jednostka wymagana: błąd java.util.function.BiConsumer [_>: String, _>: String]". –

+0

@ ZxcvMnb - W dzisiejszych czasach powinieneś używać 'JavaConverters' i jawnie je zmieniać; z dodaniem Javy 8 metody 'foreach', nie możesz już używać niejawnej konwersji dla' foreach'. –