私はScalaを学んでおり、Scalaに移行するためのJavaプロジェクトがあります。クラスを1つずつ書き直し、新しいクラスがプロジェクトを壊さないことを確認して、移行したいと思います。
このJavaプロジェクトは多くのjava.util.List
とを使用しますjava.util.Map
。List
新しいScalaクラスでは、Scalaを使用し、Map
見栄えの良いScalaコードを使用したいと思います。
問題は、新しいクラス(Scalaで作成されたもの)が既存のJavaコードとシームレスに統合されないことです。JavaにはJavaが必要java.util.List
であり、Scalaには独自のクラスが必要scala.List
です。
これが問題の簡単な例です。Main、Logic、Daoのクラスがあります。彼らは一列にお互いを呼びます:メイン->ロジック->ダオ。
public class Main {
public void a() {
List<Integer> res = new Logic().calculate(Arrays.asList(1, 2, 3, 4, 5));
}
}
public class Logic {
public List<Integer> calculate(List<Integer> ints) {
List<Integer> together = new Dao().getSomeInts();
together.addAll(ints);
return together;
}
}
public class Dao {
public List<Integer> getSomeInts() {
return Arrays.asList(1, 2, 3);
}
}
私の状況では、クラスMainとDaoはフレームワーククラスです(これらを移行する必要はありません)。クラスロジックはビジネスロジックであり、Scalaのクールな機能から多くの恩恵を受けるでしょう。
MainクラスとDaoクラスとの整合性を維持しながら、ScalaでLogicクラスを書き直す必要があります。最良の書き換えは次のようになります(機能しません):
class Logic2 {
def calculate(ints: List[Integer]) : List[Integer] = {
val together: List[Integer] = new Dao().getSomeInts()
together ++ ints
}
}
理想的な動作:Logic2内のリストはネイティブのScalaリストです。すべてのイン/アウトjava.util.Lists
は自動的にボックス化/ボックス化解除されます。しかし、これは機能しません。
代わりに、これは機能します( scala-javautils(GitHub )のおかげで):
import org.scala_tools.javautils.Implicits._
class Logic3 {
def calculate(ints: java.util.List[Integer]) : java.util.List[Integer] = {
val together: List[Integer] = new Dao().getSomeInts().toScala
(together ++ ints.toScala).toJava
}
}
しかし、それは醜いように見えます。
Java <-> Scala間でリストとマップの透過的なマジック変換を実現するにはどうすればよいですか(toScala / toJavaを実行する必要はありません)?
それが不可能な場合、Java->を使用するScalaコードを移行するためのベストプラクティスは何java.util.List
ですか?