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

133

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

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

Ответы:

177

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

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

import scala.collection.JavaConversions._

...

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

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

туз
источник
13
2.10.4 мне пришлось импортировать scala.collection.JavaConverters._ в противном случае я получил значение «asScala не является членом java.util.List [String]»
dranxo
11
JavaConversionsустарели с 2.12.0. Используйте JavaConvertersвместо этого.
Ярослав
4
Для версии 2.13.x вам понадобится import scala.jdk.CollectionConverters._ scala-lang.org/api/2.13.x/scala/jdk/CollectionConverters$.html
Николаос Георгиу
92

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

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

import scala.collection.JavaConverters._

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

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

montreal.eric
источник
7
JavaConverters следует отдавать предпочтение JavaConversions, поскольку это делает преобразование явным (и позволяет избежать случайных преобразований, которые могут привести к путанице). (То есть это правильный ответ)
Марк
так как Scala 2.13 этот класс также устарел. Вместо этого используйте scala.jdk.CollectionConverters.
dev-null
9

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

JavaConversions.asScalaBuffer(myJavaList).toList()
основание системы счисления
источник
9

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

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

import scala.collection.JavaConverters._

javalist.asScala

scalaSeq.asJava

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

user1553728
источник
6

Ярлык для преобразования списка Java в список Scala

import scala.collection.JavaConverters._

myjavaList.asScala.toList

Син-Вэй Лин
источник