Как получить Scala Список из списка Java?

У меня есть API Java, который возвращает List как:

public List<?> getByXPath(String xpathExpr)

Я использую следующий код scala:

val lst = node.getByXPath(xpath)

Теперь, если я попробую scala синтаксис сахара, например:

lst.foreach{ node => ... }

он не работает. Я получаю сообщение об ошибке:

value foreach is not a member of java.util.List[?0]

Кажется, мне нужно преобразовать список Java в список scala. Как это сделать в приведенном выше контексте?

Ответ 1

Так как Scala 2.8 это преобразование теперь встроено в язык, используя:

import scala.collection.JavaConversions._

...

lst.toList.foreach{ node =>   .... }

работает. asScala не работает

Ответ 2

Там есть удобный Scala объект для этого - scala.collection.JavaConverters

Теперь вы можете импортировать и asScala следующим образом:

import scala.collection.JavaConverters._

val lst = node.getByXPath(xpath).asScala
lst.foreach{ node =>   .... }

Это должно дать вам представление Scala Buffer, позволяющее выполнить foreach.

Ответ 3

Я искал ответ, написанный на Java, и на удивление не нашел здесь никаких чистых решений. Через некоторое время я смог разобраться в этом, поэтому решил добавить его здесь, если кто-то ищет реализацию Java (думаю, он также работает в Scala?):

JavaConversions.asScalaBuffer(myJavaList).toList()

Ответ 4

Если вам нужно преобразовать Java List<ClassA> в Scala List[ClassB], то вы должны сделать следующее:

1) Добавить

import scala.collection.JavaConverters._

2) Используйте методы asScala, toList, а затем map

List <ClassA> javaList = ...
var scalaList[ClassB] = javaList.asScala.toList.map(x => new ClassB(x))

3) Добавьте следующий конструктор ClassB, который получает ClassA в качестве параметра:

case class ClassB () {
   def this (classA: ClassA) {
      this (new ClassB (classA.getAttr1, ..., classA.getAttrN))
   }
}