Scalaのscala.List
をJavaのJava.util.List
に変換する方法は?
Scala ListとJava Listは、前者が不変で後者が可変であるため、2つの異なる獣です。したがって、1つから別のものを取得するには、最初に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
である場合は必要ありません。最後の行に示されているように、変換は暗黙的です。
これがなぜこれまで言及されなかったのかはわかりませんが、最も直感的な方法は、 JavaConverters のasJava
デコレータメソッドを直接呼び出すことです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)
explicitおよびtellちょうどに変換したい場合:
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)
更新
with 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
}