Как преобразовать scala.Список в java.util.List?
-
19-09-2019 - |
Вопрос
Как преобразовать Scala в scala.List
в Java-х java.util.List
?
Решение
Список Scala и список Java - это два разных зверя, потому что первый является неизменяемым, а второй - изменяемым.Итак, чтобы перейти от одного к другому, вам сначала нужно преобразовать список 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
, поскольку преобразование является неявным, как показано в последней строке.
Другие советы
Не уверен, почему это не упоминалось ранее, но я думаю, что самый интуитивный способ - это вызвать 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]
Подводя итог предыдущим ответам
Предполагая, что у нас есть следующее 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]
Вам решать, как вы хотите управлять своим кодом.
Довольно старые вопросы, хотя я отвечу, учитывая, но большинство предложений устарели.
import scala.collection.JavaConversions.seqAsJavaList
val myList = List("a", "b", "c")
val myListAsJavaList = seqAsJavaList[String](myList)
Обновить
с scala 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]
Начиная 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]
Для одиночных вызовов выполнение этого вручную может быть самым простым решением:
val slist = List (1, 2, 3, 4)
val jl = new java.util.ArrayList [Integer] (slist.size)
slist.foreach (jl.add (_))
Я не измерял производительность.
Простое выполнение, как предложено выше, создает неизменяемый список даже на стороне Java.Единственное рабочее решение, которое я нашел, это:
def toJList[T](l:List[T]):util.List[T] = {
val a = new util.ArrayList[T]
l.map(a.add(_))
a
}
Начиная со Scala 2.12.0 JavaConversions устарели.
Итак, самым простым решением для меня было :
java.util.Arrays.asList("a","b","c")