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

103

У меня есть 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. Как это сделать в приведенном выше контексте?

  • 2
    возможный дубликат Преобразования коллекции Java в коллекцию Scala
  • 0
    @Kim: Я не уверен, что уместно закрывать это как дубликат этого конкретного вопроса - этот конкретный вопрос говорит о Scala 2.7, а пакет scala.collection.jcl больше не существует в Scala 2.8 и 2.9.
Теги:

4 ответа

146
Лучший ответ

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

import scala.collection.JavaConversions._

...

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

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

  • 5
    Можете ли вы объяснить, почему asScala не работает?
  • 13
    2.10.4 мне пришлось импортировать scala.collection.JavaConverters._ в противном случае я получил «значение asScala не является членом java.util.List [String]»
Показать ещё 1 комментарий
70

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

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

import scala.collection.JavaConverters._

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

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

  • 6
    JavaConverters должен быть предпочтительнее JavaConversions, поскольку он делает преобразование явным (и избегает случайных преобразований, которые могут сбивать с толку). (Т.е. это правильный ответ)
6

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

JavaConversions.asScalaBuffer(myJavaList).toList()
5

Если вам нужно преобразовать 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))
   }
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню