Как получить список Scala из списка Java? - PullRequest
127 голосов
/ 15 июня 2011

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

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 List в Scala List.Как это сделать в вышеуказанном контексте?

Ответы [ 5 ]

168 голосов
/ 15 июня 2011

РЕДАКТИРОВАТЬ: Обратите внимание, что это устарело с 2.12.0.Вместо этого используйте JavaConverters.(комментарий @Yaroslav)

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

import scala.collection.JavaConversions._

...

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

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

87 голосов
/ 15 июня 2011

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

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

import scala.collection.JavaConverters._

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

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

8 голосов
/ 21 августа 2015

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

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

JavaConversions.asScalaBuffer(myJavaList).toList()
6 голосов
/ 13 февраля 2018

Поскольку scala 2.8.1 использовать JavaConverters._ конвертировать коллекции Scala и Java с использованием методов asScala и asJava.

import scala.collection.JavaConverters._

javalist.asScala

scalaSeq.asJava

см. Отношение конверсии сайт scala doc

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...