views:

126

answers:

2

How I can iterating over scala collections in java?

+2  A: 

Get a Scala Iterator from the collection and use a conversion from scala.collection.JavaConversions to turn it into a Java Iterator.

Here's an example:

scala> val li1 = List(2, 3, 5, 7, 11)
li1: List[Int] = List(2, 3, 5, 7, 11)

scala> val ii1 = li1.iterator
ii1: Iterator[Int] = non-empty iterator

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

scala> val ji1: java.util.Iterator[Int] = ii1
ji1: java.util.Iterator[Int] = IteratorWrapper(non-empty iterator)

scala> val ji2 = ii1: java.util.Iterator[Int]
ji2: java.util.Iterator[Int] = IteratorWrapper(non-empty iterator)

With the JavaConversions imported into any given scope, there's an implicit conversion that will turn any Scala Iterator[T] into a corresponding Java Iterator<T>. In the preceding example, the explicit type of the ji1 declaration triggered the application of the implicit conversion of the initializer, ii1. In the ji2 case, the type ascription on ii1 triggers the conversion.

Randall Schulz
How? I don't know use it!
isola009
+3  A: 

Some example Scala

class AThing {
  @scala.reflect.BeanProperty val aList = List(1,2,3,4,99)
}

A Java client

public class UseAThing {
  public static void main(String a[]) {
    AThing thing = new AThing();
    scala.collection.Iterator iter = thing.getAList().iterator();
    while (iter.hasNext()) {
      System.out.println(iter.next());
    }
  }
}

Output

jem@Respect:~/c/user/jem$ java -cp /opt/scala/lib/scala-library.jar:. UseAThing
1
2
3
4
99

Does that help?

Synesso