У меня есть 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. Как это сделать в приведенном выше контексте?
Так как Scala 2.8 это преобразование теперь встроено в язык, используя:
import scala.collection.JavaConversions._
...
lst.toList.foreach{ node => .... }
работает. asScala
не работает
Там есть удобный Scala объект для этого - scala.collection.JavaConverters
Теперь вы можете импортировать и asScala
следующим образом:
import scala.collection.JavaConverters._
val lst = node.getByXPath(xpath).asScala
lst.foreach{ node => .... }
Это должно дать вам представление Scala Buffer
, позволяющее выполнить foreach
.
Я искал ответ, написанный на Java, и на удивление не нашел здесь никаких чистых решений. Через некоторое время я смог разобраться в этом, поэтому решил добавить его здесь, если кто-то ищет реализацию Java (думаю, он также работает в Scala?):
JavaConversions.asScalaBuffer(myJavaList).toList()
Если вам нужно преобразовать 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))
}
}