Як перетворити Scala scala.List
в Java java.util.List
?
Як перетворити Scala scala.List
в Java java.util.List
?
Відповіді:
Список 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
, оскільки конверсія неявна, як це демонструє останній рядок.
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
Оновлення
зі шкалою 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