JavaリストからScalaリストを取得する方法は?


133

次のようなリストを返すJava APIがあります。

public List<?> getByXPath(String xpathExpr)

以下のscalaコードを使用しています:

val lst = node.getByXPath(xpath)

今私がスカラ構文砂糖を試してみると:

lst.foreach{ node => ... }

それは動作しません。エラーが発生します:

value foreach is not a member of java.util.List[?0]

JavaリストをScalaリストに変換する必要があるようです。上記のコンテキストでそれを行う方法?



@キム:特定の質問の複製としてこれを閉じるのが適切かどうかはわかりません-その特定の質問はScala 2.7について話しているので、scala.collection.jclパッケージはScala 2.8と2.9にはもう存在しません。
ケンブルーム

回答:


177

編集:これは2.12.0以降廃止されることに注意してください。JavaConverters代わりに使用してください。(@Yaroslavによるコメント)

Scala 2.8以降、この変換は以下を使用して言語に組み込まれています。

import scala.collection.JavaConversions._

...

lst.toList.foreach{ node =>   .... }

動作します。asScala動作しませんでした


13
2.10.4ではscala.collection.JavaConverters._をインポートする必要がありました。それ以外の場合は、「value asScalaはjava.util.List [String]のメンバーではない」というエラーが表示されました
dranxo

11
JavaConversions2.12.0以降は非推奨です。JavaConverters代わりに使用してください。
Yaroslav

4
2.13.xの場合、scala-lang.org / api / 2.13.x / scala / jdk / CollectionConverters $ .htmlが必要import scala.jdk.CollectionConverters._ です
Nikolaos Georgiou

92

このための便利なScalaオブジェクトがあります-scala.collection.JavaConverters

asScala次のようにしてインポートおよびその後に実行できます。

import scala.collection.JavaConverters._

val lst = node.getByXPath(xpath).asScala
lst.foreach{ node =>   .... }

これにより、ScalaのBuffer表現が得られ、を実現できるはずですforeach


7
JavaConvertersはJavaConversionsよりも変換を明示的にするため(そして混乱を招く可能性のある偶発的な変換を回避するため)、JavaConversionsよりも推奨されます。(つまり、これが正解です)
Mark

Scala 2.13以降、このクラスも廃止されました。代わりにscala.jdk.CollectionConvertersを使用してください。
dev-null

9

私はJavaで書かれた回答を探していましたが、驚くべきことに、ここでは明確な解決策を見つけることができませんでした。しばらくしてそれを理解できたので、誰かがJava実装を探している場合に備えて、ここに追加することにしました(Scalaでも機能すると思いますか?):

JavaConversions.asScalaBuffer(myJavaList).toList()

9

Java List<ClassA>をScala に変換するList[ClassB]必要がある場合は、以下を実行する必要があります。

1)追加

import scala.collection.JavaConverters._

2)使用方法asScalatoListおよびその後、map

List <ClassA> javaList = ...
var scalaList[ClassB] = javaList.asScala.toList.map(x => new ClassB(x))

3)パラメーターとしてClassB受け取るコンストラクターに以下を追加しClassAます。

case class ClassB () {
   def this (classA: ClassA) {
      this (new ClassB (classA.getAttr1, ..., classA.getAttrN))
   }
}

6

scala 2.8.1以降は、JavaConverters._ asScalaおよびasJavaメソッドを使用してscalaおよびJavaコレクションを変換するために使用します。

import scala.collection.JavaConverters._

javalist.asScala

scalaSeq.asJava

変換関係のscala docサイトを参照してください


6

JavaリストをScalaリストに変換するショートカット

import scala.collection.JavaConverters._

myjavaList.asScala.toList

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