What's the new way to iterate over a Java Map in Scala 2.8.0?
Asked Answered
V

1

36

How does scala.collection.JavaConversions supercede the answers given in Stack Overflow question Iterating over Java collections in Scala (it doesn't work because the "jcl" package is gone) and in Iterating over Map with Scala (it doesn't work for me in a complicated test which I'll try to boil down and post here later).

The latter is actually a Scala Map question, but I think I need to know both answers in order to iterate over a java.util.Map.

Vinylidene answered 25/4, 2010 at 16:46 Comment(0)
P
81

In 2.8, you import scala.collection.JavaConversions._ and use as a Scala map. Here's an example (in 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

If you specifically want a Scala iterator, use jmap.iterator (after the conversions import).

Pitterpatter answered 25/4, 2010 at 16:57 Comment(3)
Wow, this is a great, painless solution!Threewheeler
There should be a way without converting to scala map, right ? It will better if we are iterating over java map in a loop, it will avoid unnecessary object creation. Getting " found : (String, String) => Unit required: java.util.function.BiConsumer[_ >: String, _ >: String]" error.Pulcheria
@ZxcvMnb - These days you should use JavaConverters and explicitly change them; with Java 8's addition of a foreach method, you can't use implicit conversion any more for foreach.Pitterpatter

© 2022 - 2024 — McMap. All rights reserved.