Jak przekonwertować Scala scala.List
na Java java.util.List
?
Jak przekonwertować Scala scala.List
na Java java.util.List
?
Odpowiedzi:
Scala List i Java List to dwie różne bestie, ponieważ pierwsza jest niezmienna, a druga jest zmienna. Tak więc, aby przejść od jednej do drugiej, musisz najpierw przekonwertować listę Scala na zmienną kolekcję.
W Scali 2.7:
import scala.collection.jcl.Conversions.unconvertList
import scala.collection.jcl.ArrayList
unconvertList(new ArrayList ++ List(1,2,3))
Począwszy od 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): _*)
Jednak asList
w tym przykładzie nie jest to konieczne, jeśli oczekiwany typ to Java List
, ponieważ konwersja jest niejawna, jak pokazano w ostatnim wierszu.
scala.collection.JavaConverters
od 2.12 dnia
Nie jestem pewien, dlaczego nie zostało to wcześniej wspomniane, ale myślę, że najbardziej intuicyjnym sposobem jest wywołanie asJava
metody dekoratora JavaConverters bezpośrednio z listy 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]
Zakładając, że mamy List
:
scala> val scalaList = List(1,2,3)
scalaList: List[Int] = List(1, 2, 3)
Jeśli chcesz wyrazić się jasno i powiedzieć dokładnie, co chcesz przekonwertować:
scala> import scala.collection.JavaConverters._
import scala.collection.JavaConverters._
scala> scalaList.asJava
res11: java.util.List[Int] = [1, 2, 3]
Jeśli nie chcesz współkontrolować konwersji i pozwolić kompilatorowi wykonać niejawną pracę za Ciebie:
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]
To od Ciebie zależy, jak chcesz kontrolować swój kod.
Zaczynając Scala 2.13
, pakiet scala.jdk.CollectionConverters
udostępnia asJava
za pośrednictwem pimp Seq
i zastępuje pakiety 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]
Odpowiem na dość stare pytania, ale większość sugestii jest przestarzała.
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
Aktualizacja
ze skalą 2.9.2:
import scala.collection.JavaConversions._
import scala.collection.mutable.ListBuffer
val x: java.util.List[Int] = ListBuffer( List( 1, 2, 3 ): _* )
wynik
[1, 2, 3]
Od Scala 2.12.0 JavaConversions jest przestarzała.
Więc najprostszym rozwiązaniem dla mnie było:
java.util.Arrays.asList("a","b","c")
import scala.collection.JavaConverters._
2.12.4