Scalascala.List
をJavaに変換する方法はjava.util.List
?
9 に答える
これが以前に言及されていない理由はわかりませんが、最も直感的な方法は、ScalaリストでJavaConvertersasJava
のデコレータメソッドを直接呼び出すことだと思います。
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リストとJavaリストは2つの異なる獣です。前者は不変であり、後者は可変であるためです。したがって、あるものから別のものに移動するには、最初に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
以前の回答を要約するには
次のものがあると仮定します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)
アップデート
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]
単一の呼び出しの場合、手動で行うのが最も簡単な解決策かもしれません。
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
}