Як отримати список Scala зі списку Java?


133

У мене є Java API, який повертає список типу:

public List<?> getByXPath(String xpathExpr)

Я використовую наведений нижче код скали:

val lst = node.getByXPath(xpath)

Тепер, якщо я спробую синтаксис цукру-синтаксису типу:

lst.foreach{ node => ... }

це не працює. Я отримую помилку:

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

Здається, мені потрібно перетворити список Java на список Scala. Як це зробити у вищезгаданому контексті?



@Kim: Я не впевнений, що доцільно закрити це як дублікат цього конкретного питання - саме це питання стосується Scala 2.7, а пакет scala.collection.jcl вже не існує у Scala 2.8 та 2.9.
Кен Блум

Відповіді:


177

EDIT: Зауважте, що це застаріло з 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.


7
JavaConverters слід віддавати перевагу перед JavaConversions, оскільки це робить перетворення явним (і уникає випадкових перетворень, які можуть бути заплутаними). (Тобто це правильна відповідь)
Марк

оскільки масштаб 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, який стосується конверсій


6

Ярлик для перетворення списку Java в список масштабу

import scala.collection.JavaConverters._

myjavaList.asScala.toList

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.