web-dev-qa-db-ja.com

scala.ListをJava.util.Listに変換する方法は?

Scalaのscala.ListをJavaのJava.util.Listに変換する方法は?

103
Alex Baranosky

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である場合は必要ありません。最後の行に示されているように、変換は暗黙的です。

66

これがなぜこれまで言及されなかったのかはわかりませんが、最も直感的な方法は、 JavaConvertersasJavaデコレータメソッドを直接呼び出すことです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]
151
dimitrisli

以前の回答をまとめるには

次の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]

コードをどのように制御するかはあなた次第です。

22
Kamil Lelonek

かなり古い質問ですが、私は答えますが、与えられた提案のほとんどは非推奨です。

import scala.collection.JavaConversions.seqAsJavaList

val myList = List("a", "b", "c")
val myListAsJavaList = seqAsJavaList[String](myList)
6
Shirish Kumar

更新

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]
5

開始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]
4
Xavier Guihot

単一の呼び出しの場合、手作業で行うのが最も簡単なソリューションかもしれません。

val slist = List (1, 2, 3, 4)          
val jl = new Java.util.ArrayList [Integer] (slist.size)
slist.foreach (jl.add (_))   

パフォーマンスを測定しませんでした。

1
Stefan W.

上記の提案どおりに実行すると、Java側でも不変リストが生成されます。

def toJList[T](l:List[T]):util.List[T] = {
  val a = new util.ArrayList[T]
  l.map(a.add(_))
  a
 }
0
Vitamon