Я изучаю Scala, и у меня есть проект Java для перехода на Scala. Я хочу перенести его путем перезаписи классов один за другим и проверки того, что новый класс не разбил проект.Java <-> Scala interop: transparent Преобразование списка и карты
В этом Java-проекте используется множество java.util.List
и java.util.Map
. В новых классах Scala я хотел бы использовать Scala's 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);
}
}
В моей ситуации, классы Главная и Dao рамочные классы (не нужно переносить их). Класс Логика является бизнес-логикой и принесет много пользы от замечательных функций Scala.
мне нужно переписать класс Logic в Scala при сохранении целостности с классами Главная и Dao. Лучший переписывание будет выглядеть (не работает):
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
и друзей?
очень хорошо положил, +1 – geowa4
(+1) очень красиво заявлено. Я бы хотел, чтобы этот пост был вокруг, когда я некоторое время назад боролся с ним. – Shaun
Спасибо за такую полную запись. Нашли это через google (конечно!), так что уже сэкономил кому-то много боли! –