JavaコレクションをScalaコレクションに変換する


87

Stack Overflowの質問Scalaの新しいHashSet(Collection)相当する質問に関連して、Javaコレクション(java.util.Listたとえば)をScalaコレクションに変換するにはどうすればよいListですか?

私は実際にはJava API呼び出しをSpring に変換しようとしてSimpleJdbcTemplateいます。これはを返すのでjava.util.List<T>、Scala不変に変換されますHashSet。だから例えば:

val l: java.util.List[String] = javaApi.query( ... )
val s: HashSet[String] = //make a set from l

これは動作するようです。批評は大歓迎です!

import scala.collection.immutable.Set
import scala.collection.jcl.Buffer 
val s: scala.collection.Set[String] =
                      Set(Buffer(javaApi.query( ... ) ) : _ *)

回答:


17

あなたの最後の提案は機能しますが、使用を避けることもできますjcl.Buffer

Set(javaApi.query(...).toArray: _*)

scala.collection.immutable.Setおかげで、デフォルトでが利用可能になることに注意してくださいPredef.scala


9
タイプ情報を保持したい場合、この提案は機能しません
oxbow_lakes '24年

126

将来の参考のために:Scala 2.8では、次のように行うことができます。

import scala.collection.JavaConversions._
val list = new java.util.ArrayList[String]()
list.add("test")
val set = list.toSet

setscala.collection.immutable.Set[String]、この後。

(JavaConvertersを使用した)より明確な方法については、Ben Jamesの回答も参照してください。これは現在推奨されているようです。


今のようJavaConversionsにいくつかの暗黙のtoSet呼び出しを必要としないように見えます。
ラジッシュ2012

@Rajish変換が明示的である方がいいと思います(stackoverflow.com/questions/8301947/…を参照)
krookedking 2014年

正解です。importscala.collection.JavaConverters._を使用することをお勧めします
Abhishek Sengupta


25

JavaConversionsrobinstの回答)とJavaConvertersBen Jamesの回答)は、Scala 2.10で非推奨になりました。

JavaConversionsの代わりに以下を使用します。

import scala.collection.convert.wrapAll._

aleksandr_hramcovで提案されています。

JavaConvertersの代わりに以下を使用します。

import scala.collection.convert.decorateAll._

どちらの場合も、変換/コンバーターをそれぞれJavaまたはScalaにのみインポートする可能性もあります。例:

import scala.collection.convert.wrapAsScala._

更新:JavaConversionsJavaConvertersが廃止された という上記の説明は間違っているようです。Scala 2.10には非推奨のプロパティがいくつかあり、それらをインポートすると非推奨の警告が出されました。したがって、ここでの代替インポートはエイリアスのみのようです。私はまだそれらを好みますが、私見として名前はより適切です。


JavaConversionsとJavaConvertersが非推奨になったのはなぜですか?現在のドキュメンテーションでは、2.11.8はどちらも非推奨としてマークされておらず、新しく推奨される使用法であることを示す「decorateAll」または「wrapAll」への参照もありません。
Joost den Boer

@JoostdenBoer Scala 2.10 は廃止予定のデコレータがいくつかあったようですが、Scala 2.11で再び削除されたようです。
ステムプラ

14

また、この優れたライブラリである、JavaとScalaのコレクション間で双方向の変換を行うscalaj-collectionを探索することもできます。あなたの場合、java.util.ListをScalaリストに変換するには、次のようにします。

val list = new java.util.ArrayList[java.lang.String]
list.add("A")
list.add("B")
list.asScala

1
そのライブラリはこれまでで最高のものです。本当に本当にうまくいきます。
Michael Neale

6
数年後にこれを再検討するために、ScalaのJavaConvertersが進むべき道です。
Surya Suravarapu

4

開始するとScala 2.13、パッケージscala.jdk.CollectionConvertersはパッケージを置き換えますscala.collection.JavaConverters/JavaConversions._

import scala.jdk.CollectionConverters._

// val javaList: java.util.List[String] = java.util.Arrays.asList("one","two","three")
javaList.asScala
// collection.mutable.Buffer[String] = Buffer("one", "two", "three")
javaList.asScala.toSet
// collection.immutable.Set[String] = Set("one", "two", "three")

3
val array = java.util.Arrays.asList("one","two","three").toArray

val list = array.toList.map(_.asInstanceOf[String])

これは素晴らしい答えであり、私の問題を解決しました。インターネットで言及されているほとんどのメソッドは、(例)java.util.List [java.lang.Long]をscala.collection.immutable.List [java.lang.Long]に変換するだけです。したがって、このメソッドは私にとってそれをscala.collection.immutable.List [scala.Long]に変換するために機能しました
ajkl

2

toArray呼び出しにタイプ情報を追加して、セットをパラメーター化することができます。

 val s = Set(javaApi.query(....).toArray(new Array[String](0)) : _*)

これは、コレクションパッケージがScala 2.8の大幅な改良を経て、scala.collection.jclパッケージが廃止されるため、望ましいかもしれません。


1

Javaコレクションを配列に変換し、それからScalaリストを作成できます。

val array = java.util.Arrays.asList("one","two","three").toArray
val list = List.fromArray(array)

2
私のjava.util.Listがパラメータ化されたリストとしてJava APIから戻ってくるので、これは素晴らしいことではありません(そのため、APIへの呼び出しによりjava.util.List <String>が生成されます)-これを変換しようとしていますscala不変のHashSetに
oxbow_lakes 2009年

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.