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


回答:


69

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


val x:java.util.List [Int]は依然として不変です。Javaでx.add(something)を試してください
Vitamon

1
@Vitamonそれは私のために何のエラーもスローしません-私はそれを確認するためにテストしました。
ダニエルC.ソブラル2013年

4
scala.collection.JavaConverters2.12以降
Jeroen Kransen

2.12.1の場合、Scala forループでJavaリストをすぐに反復すると、JavaConvertersパッケージのasScalaBuffer()でうまく運んだ:scala-lang.org/api/2.12.1/scala/collection/JavaConverters $ .html
Sarah Messer

165

これが以前に言及されていない理由はわかりませんが、最も直感的な方法は、ScalaリストasJavaJavaConvertersのデコレータメソッドを直接呼び出すことです。

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]

6
また、しばらくの間望まれない可能性がある暗黙の魔法に依存するのではなく、明示的になることも必要です。
Kamil Lelonek 2014年

これは、Javaコードで後で使用するためにリストをシリアル化する場合に問題を引き起こします... ClassNotFoundException:scala.collection.convert.Wrappersが発生します。この場合、Arrays.asList(foo:_ *)が機能します。
Mohan

ScalaでJavaを使用する必要があるたびに、このページにアクセスします。残念ながら、「。asJava」の適切なインポートの提案を提案する方法はありません((
mulya

24

以前の回答を要約するには

次のように仮定します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]

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


8

以降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]

7

かなり古い質問ですが、回答しますが、ほとんどの提案は非推奨です。

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
prayagupd 2017年

5

更新

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]

1

単一の呼び出しの場合、手動で行うのが最も簡単な解決策かもしれません。

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

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


0

上記の提案どおりに実行すると、Java側でも不変のリストが生成されます。私が見つけた唯一の実用的な解決策はこれです:

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

0

Scala 2.12.0以降、JavaConversionsは非推奨になりました。

だから私にとって最も簡単な解決策は:

java.util.Arrays.asList("a","b","c")

1
この回答では、これを使用してScalaリストをJavaリストに変換する方法については説明していません。Arrays.asListは、サイズ変更可能なリストではないArrays.ArrayListを返すため、util.ArrayListがあると思われる場合に予期しないエラーを引き起こす可能性があるため、問題が発生する可能性もあります。
プーレン2017年

1
非推奨は本当です、import scala.collection.JavaConverters._2.12.4のためにあります
祈り
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.