Итерация над коллекциями Scala в Java

Как я могу перебирать коллекции Scala в Java?

Ответы

Ответ 1

Пример Scala

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

Клиент Java

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());
    }
  }
}

Выход

[email protected]:~/c/user/jem$ java -cp /opt/scala/lib/scala-library.jar:. UseAThing
1
2
3
4
99

Помогает ли это?

Ответ 2

Получите Scala Iterator из коллекции и используйте преобразование из scala.collection.JavaConversions, чтобы превратить его в Java Iterator.

Вот пример:

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)

При использовании JavaConversions, импортированного в любую заданную область, существует неявное преобразование, которое превратит любой Scala Iterator[T] в соответствующую Java Iterator<T>. В предыдущем примере явный тип объявления ji1 вызвал приложение неявного преобразования инициализатора ii1. В случае ji2 тип ascription на ii1 запускает преобразование.