私はScalaを学んでおり、私はScalaに移行するためのJavaプロジェクトを持っています。クラスを1つずつ書き直して、新しいクラスがプロジェクトを中断していないことを確認して、そのクラスを移行したいと考えています。Java <-> Scala interop:transparentリストとマップの変換
このJavaプロジェクトでは、java.util.List
とjava.util.Map
のロットが使用されています。新しいScalaクラスでは、ScalaのList
とMap
を使用して、見栄えの良いScalaコードを作成したいと考えています。
問題は、新しいクラス(Scalaで使用されるクラス)が、既存のJavaコードとシームレスに統合されないという点です。Javaにはjava.util.List
が必要であり、Scalaには独自のscala.List
が必要です。
ここでは、問題の簡単な例を示します。クラスがありますメイン,ロジック,ダオです。彼らはラインでお互いを呼び出します:メイン - >ロジック - >ダオ。私の状況で
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);
}
}
、クラスメインとダオは、フレームワーククラス(私はそれらを移行する必要はありません)です。クラス論理はビジネスロジックであり、Scalaのクールな機能から多くの利益を得ます。
は、私はクラスメインとダオとの整合性を維持しながら、Scalaでクラスロジックを書き換える必要があります。最高の書き換えは(動作しない)ようになります。
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.util.List
とフレンドを使用するJava - > Scalaコードを移行するためのベストプラクティスは何ですか?
非常によく置いて、+1 – geowa4
(+1)は非常にきれいに述べた。私はこのポストがいつか戻って苦労していたときに、このポストがあったことを願っています。 – Shaun
このような徹底的な書面をありがとう。 Googleでこれを見つけました(もちろん!)すでに誰かに苦痛をたくさん救った! –