Je suis en train d'apprendre Scala et j'ai un projet en Java pour migrer à la Scala. Je veux migrer en réécrivant les classes une par une, et en vérifiant que la nouvelle classe ne rompt pas le projet.
Ce projet Java utilise beaucoup d' java.util.List
et java.util.Map
. Dans les nouvelles classes Scala je voudrais utiliser Scala List
et Map
d'avoir de bonne à la recherche de la Scala de code.
Le problème est que les nouvelles classes (ceux qui sont wtitten en Scala) de ne pas intégrer seamelessly avec Java code: Java besoins en java.util.List
, Scala a besoin de sa propre scala.List
.
Voici un exemple simplifié du problème. Il y a des classes Principales, la Logique, Dao. Ils s'appellent les uns les autres dans une ligne: Principal -> Logique -> 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 Principales et Dao sont les classes du framework (je n'ai pas besoin de migrer). Classe Logique est la logique de gestion et profitera à beaucoup de Scala fonctionnalités intéressantes.
J'ai besoin de réécrire la classe de Logique dans Scala, tout en préservant l'intégrité des classes Principales et Dao. Le meilleur de réécriture ressemblerait (ne fonctionne pas):
class Logic2 {
def calculate(ints: List[Integer]) : List[Integer] = {
val together: List[Integer] = new Dao().getSomeInts()
together ++ ints
}
}
Le comportement idéal: des Listes à l'intérieur de Logic2 sont indigènes Scala Listes. Tous les in/out java.util.Lists
obtenir boxed/ "unboxed" automagiquement. Mais cela ne fonctionne pas.
Au lieu de cela, ce n'travail (grâce à la 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 transparent magie de conversion de Listes et Cartes entre Java <-> Scala (sans besoin de faire toScala/toJava)?
Si il n'est pas possible, quelles sont les meilleures pratiques en matière de migration Java -> Scala code qui utilise java.util.List
et les amis?