barroco
barroco

Reputation: 3108

iterating over Scala collections in Java

How I can iterate over Scala collections in Java?

Upvotes: 19

Views: 8609

Answers (3)

k107
k107

Reputation: 16440

for(Item item: JavaConverters.seqAsJavaListConverter(seq).asJava()) {
    // Do thing with item
}

Upvotes: 2

Synesso
Synesso

Reputation: 38958

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?

Upvotes: 18

Randall Schulz
Randall Schulz

Reputation: 26486

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.

Upvotes: 3

Related Questions