Як перетворити scala.List в java.util.List?


Відповіді:


69

Список Scala та Java List - це два різних звірі, тому що перший є непорушним, а другий - незмінним. Отже, щоб перейти від одного до іншого, спочатку потрібно перетворити список Scala в колекцію, що змінюється.

У Scala 2.7:

import scala.collection.jcl.Conversions.unconvertList
import scala.collection.jcl.ArrayList
unconvertList(new ArrayList ++ List(1,2,3))

Від Scala 2.8 далі:

import scala.collection.JavaConversions._
import scala.collection.mutable.ListBuffer
asList(ListBuffer(List(1,2,3): _*))
val x: java.util.List[Int] = ListBuffer(List(1,2,3): _*)

Однак asListу цьому прикладі немає необхідності, якщо очікуваний тип - це Java List, оскільки конверсія неявна, як це демонструє останній рядок.


Val x: java.util.List [Int] все ще незмінний. Просто спробуйте в Java на x.add (щось) - це викине помилку
Vitamon

1
@Vitamon Це не кидає для мене жодної помилки - я просто перевірив це для підтвердження.
Даніель К. Собрал

4
Застаріло на користь scala.collection.JavaConvertersз 2.12 о.
Єроен Крансен

для 2.12.1, коли негайно повторювався список Java з циклом Scala for, мені пощастило з asScalaBuffer () в пакеті JavaConverters
Сара Мессер

165

Не впевнений, чому це раніше не згадувалося, але я думаю, що найінтуїтивнішим способом є використання asJavaметоду декоратора JavaConverters безпосередньо у списку Scala:

scala> val scalaList = List(1,2,3)
scalaList: List[Int] = List(1, 2, 3)

scala> import scala.collection.JavaConverters._
import scala.collection.JavaConverters._

scala> scalaList.asJava
res11: java.util.List[Int] = [1, 2, 3]

6
Це також вимагає від вас явного, а не залежно від якоїсь неявної магії, яка може бути небажаною деякий час.
Каміль Лелонек

Це спричиняє проблеми, якщо серіалізація списку для подальшого використання в коді Java ... це призводить до ClassNotFoundException: scala.collection.convert.Wrappers. Arrays.asList (foo: _ *) працює в цьому випадку.
Мохан

Я заходжу на цю сторінку щоразу, коли мені потрібно використовувати Java в Scala. На жаль , немає ніякого способу , ідея не запропонувати мені правильне імпорт пропозицію для «.asJava» ((
Mulya

24

Підбити підсумки попередніх відповідей

Припускаючи, що ми маємо наступне List:

scala> val scalaList = List(1,2,3)
scalaList: List[Int] = List(1, 2, 3)

Якщо ви хочете бути явним і точно сказати, що ви хочете конвертувати:

scala> import scala.collection.JavaConverters._
import scala.collection.JavaConverters._

scala> scalaList.asJava
res11: java.util.List[Int] = [1, 2, 3]

Якщо ви не хочете, щоб конверсії з керуванням і дозволяли компілятору неявно працювати для вас:

scala> import scala.collection.JavaConversions._
import scala.collection.JavaConversions._

scala> val javaList: java.util.List[Int] = scalaList
javaList: java.util.List[Int] = [1, 2, 3]

Ви вирішуєте, як ви хочете контролювати свій код.


8

Починаючи Scala 2.13, пакет scala.jdk.CollectionConvertersнадає asJavaза допомогою сутенера Seqта замінює пакети scala.collection.JavaConverters/JavaConversions:

import scala.jdk.CollectionConverters._

// val scalaList: List[Int] = List(1, 2, 3)
scalaList.asJava
// java.util.List[Int] = [1, 2, 3]

7

Досить старі питання, хоча я відповім, але дано, але більшість пропозицій застаріли.

import scala.collection.JavaConversions.seqAsJavaList

val myList = List("a", "b", "c")
val myListAsJavaList = seqAsJavaList[String](myList)

object JavaConversions in package collection is deprecated (since 2.12.0): use JavaConverters
prayagupd

5

Оновлення

зі шкалою 2.9.2:

import scala.collection.JavaConversions._
import scala.collection.mutable.ListBuffer
val x: java.util.List[Int] = ListBuffer( List( 1, 2, 3 ): _* )

результат

[1, 2, 3]

1

Для одного виклику це зробити вручну може бути найпростішим рішенням:

val slist = List (1, 2, 3, 4)          
val jl = new java.util.ArrayList [Integer] (slist.size)
slist.foreach (jl.add (_))   

Я не вимірював продуктивність.


0

Просто виконання, як було запропоновано вище, створює незмінний список навіть на стороні Java. Єдине діюче рішення, яке я знайшов:

def toJList[T](l:List[T]):util.List[T] = {
  val a = new util.ArrayList[T]
  l.map(a.add(_))
  a
 }

0

Оскільки програму Scala 2.12.0 JavaConversions застаріла.

Тож найпростішим рішенням для мене було:

java.util.Arrays.asList("a","b","c")

1
Ця відповідь не пояснює, як за допомогою цього перетворити список масштабів у список java. Arrays.asList також може бути проблематичним, оскільки він повертає Arrays.ArrayList, який не є змінним списком, який може викликати несподівані помилки, якщо ви думаєте, що у вас є util.ArrayList.
puhlen

1
Позбавлення справжнього, є import scala.collection.JavaConverters._для 2.12.4
prayagupd
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.