Как преобразовать scala.List в java.util.List? - PullRequest
101 голосов
/ 12 марта 2010

Как преобразовать Scala scala.List в Java java.util.List?

Ответы [ 9 ]

150 голосов
/ 29 декабря 2013

Не знаю, почему это не было упомянуто ранее, но я думаю, что наиболее интуитивный способ - вызвать 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]
66 голосов
/ 12 марта 2010

Scala List и Java List - это два разных зверя, потому что первый неизменен, а второй изменчив. Итак, чтобы перейти от одного к другому, вам сначала нужно преобразовать Scala List в изменчивую коллекцию.

В 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, поскольку преобразование неявное, как показано в последней строке.

21 голосов
/ 28 ноября 2014

Подводя итог предыдущим ответам

Предполагая, что у нас есть следующее 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]

Вам решать, как вы хотите контролировать свой код.

6 голосов
/ 20 января 2017

Довольно старые вопросы, хотя я отвечу, учитывая, но большинство предложений устарели.

import scala.collection.JavaConversions.seqAsJavaList

val myList = List("a", "b", "c")
val myListAsJavaList = seqAsJavaList[String](myList)
5 голосов
/ 15 июля 2012

Обновление

со скалой 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]
2 голосов
/ 31 марта 2019

Начиная с 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]
1 голос
/ 12 марта 2010

Для отдельных вызовов выполнение этого вручную может быть самым простым решением:

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

Я не измерял производительность.

0 голосов
/ 01 июня 2017

Начиная с версии Scala 2.12.0 JavaConversion устарела.

Итак, самое простое решение для меня было:

java.util.Arrays.asList("a","b","c")
0 голосов
/ 08 мая 2013

Выполнение, как предложено выше, создает неизменный список даже на стороне Java. Единственное рабочее решение, которое я нашел, это:

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