次のようなリストを返すJava APIがあります。
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に変換する必要があるようです。上記のコンテキストでそれを行う方法は?
JavaConverters
を使用してください。 (@Yaroslavによるコメント)Scala 2.8であるため、この変換は次を使用して言語に組み込まれています。
import scala.collection.JavaConversions._
...
lst.toList.foreach{ node => .... }
動作します。 asScala
は機能しませんでした
このために便利なScalaオブジェクトがあります- scala.collection.JavaConverters
次のように、インポートとasScala
を後で実行できます。
import scala.collection.JavaConverters._
val lst = node.getByXPath(xpath).asScala
lst.foreach{ node => .... }
これにより、ScalaのBuffer
表現が得られ、foreach
を実現できます。
Java List<ClassA>
をScala List[ClassB]
に変換する必要がある場合、以下を実行する必要があります。
1)追加
import scala.collection.JavaConverters._
2)メソッドasScala
、toList
を使用してから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))
}
}
私はJavaで書かれた答えを探していましたが、驚くべきことにここにはきれいな解決策が見つかりませんでした。しばらくしてそれを理解できたので、誰かがJava実装を探している場合に備えてここに追加することにしました(Scalaでも動作すると思いますか?):
JavaConversions.asScalaBuffer(myJavaList).toList()
scala 2.8.1はJavaConverters._
を使用して、asScalaメソッドとasJavaメソッドを使用してscalaおよびJavaコレクションを変換します。
import scala.collection.JavaConverters._
javalist.asScala
scalaSeq.asJava
変換関係を参照してください scala doc site