J'apprends Scala et j'ai un projet Java à migrer vers Scala. Je veux le migrer en réécrivant les classes une par une et en vérifiant que cette nouvelle classe n'a pas brisé le projet. Ce projet Java utilise beaucoup de java.util.List
et java.util.Map
. Dans les nouvelles classes Scala, j'aimerais utiliser les codes List
et Map
de Scala pour avoir un code Scala attrayant.Java <-> Scala interop: liste transparente et conversion de carte
Le problème est que les nouvelles classes (celles qui sont wtitten dans Scala) ne s'intègrent pas sans faille avec le code Java existant: Java a besoin de java.util.List
, Scala a besoin de ses propres scala.List
.
Voici un exemple simplifié du problème. Il existe des classes Principal, Logique, Dao. Ils s'appellent l'un l'autre dans une ligne: 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);
}
}
Dans ma situation, les classes principal et Dao sont des classes cadres (je ne suis pas besoin de les migrer). Classe Logique est la logique métier et bénéficiera beaucoup de fonctionnalités cool Scala.
J'ai besoin de réécrire la classe Logic à Scala, tout en préservant l'intégrité des classes principal et Dao. La meilleure rewrite ressemblerait (ne fonctionne pas):
class Logic2 {
def calculate(ints: List[Integer]) : List[Integer] = {
val together: List[Integer] = new Dao().getSomeInts()
together ++ ints
}
}
comportement Idéal: Listes intérieur LOGIC2 native Scala sont cotés. All in/out java.util.Lists
être mis en boîte/unboxed automagically. Mais ça ne marche pas.
, cela ne au lieu de travail (grâce à 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
}
}
Mais il semble laid. Comment puis-je obtenir une conversion magique transparente des listes et des cartes entre Java < -> Scala (sans besoin de faire toScala/toJava)?
Si ce n'est pas possible, quelles sont les meilleures pratiques pour migrer Java -> code Scala qui utilise java.util.List
et les amis?
très bien mis, +1 – geowa4
(+1) très joliment déclaré. J'aurais aimé que ce message soit publié quand je me suis débattu avec lui il y a quelque temps. – Shaun
Merci pour cet article si détaillé. Trouvé ceci via google (bien sûr!) donc déjà sauvé quelqu'un beaucoup de douleur! –