Как преобразовать Scala scala.List
в Java java.util.List
?
Как преобразовать Scala scala.List
в Java java.util.List
?
Ответы:
Scala List и 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
, поскольку преобразование неявное, как показано в последней строке.
scala.collection.JavaConverters
с 2.12 по
Не уверен, почему об этом не упоминалось раньше, но я думаю, что наиболее интуитивно понятный способ - вызвать 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]
Вам решать, как вы хотите управлять своим кодом.
Начиная 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]
Довольно старые вопросы, хотя я отвечу, учитывая, что большинство предложений устарели.
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
Обновить
со 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.12.0 JavaConversions устарела.
Итак, самым простым решением для меня было:
java.util.Arrays.asList("a","b","c")
import scala.collection.JavaConverters._
на 2.12.4