web-dev-qa-db-ja.com

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

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

public List<?> getByXPath(String xpathExpr)

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

val lst = node.getByXPath(xpath)

scala構文シュガーを試してみると:

lst.foreach{ node => ... }

それは動作しません。エラーが表示されます:

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

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

127
ace

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

Scala 2.8であるため、この変換は次を使用して言語に組み込まれています。

import scala.collection.JavaConversions._

...

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

動作します。 asScalaは機能しませんでした

169
ace

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

次のように、インポートとasScalaを後で実行できます。

import scala.collection.JavaConverters._

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

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

87
montreal.eric

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))
   }
}
9

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

JavaConversions.asScalaBuffer(myJavaList).toList()
8
Radix

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

import scala.collection.JavaConverters._

javalist.asScala

scalaSeq.asJava

変換関係を参照してください scala doc site

6
user1553728