Я пишу небольшое приложение JavaFx на Scala, и мне нравится использовать для этого RxScala и RxJavaFx. С помощью следующего кода я получаю RxJava Observable
:
JavaFxObservable.fromObservableValue(textfield.textProperty())
Очевидно, поскольку я пишу на Scala, вместо этого я хотел бы иметь RxScala Observable
. Теперь я нашел этот пост, говоря, что мне нужно либо импортировать класс неявного преобразования JavaConversions._
, либо вызвать toScalaObservable
напрямую. Однако первый вариант мне не подходит, а второй вариант выглядит некрасиво:
Вариант 1:
import rx.lang.scala.JavaConversions._
JavaFxObservable.fromObservableValue(textfield.textProperty())
.map(s => /* do something */)
Это не работает, так как RxJava также предлагает оператор map
, хотя тип аргумента технически отличается.
Вариант 2:
import rx.lang.scala.JavaConversions._
toScalaObservable(JavaFxObservable.fromObservableValue(textfield.textProperty()))
.map(s => /* do something */)
Это работает, но будьте честны, это выглядит просто ужасно!
Вопрос 1. Я что-то упустил или это действительно единственные два варианта?
Я имею в виду, что для преобразования стандартных коллекций Java в коллекции Scala (и наоборот) у вас есть два варианта: JavaConverters
и JavaConversions
. Первый вводит ключевое слово asJava
/asScala
, тогда как второй эквивалентен rx.lang.scala.JavaConversions
и неявно выполняет преобразование за вас (если вам повезет!). Погуглив предпочтения этих двух, становится ясно, что большинство людей предпочитают более явное неявное преобразование из JavaConverters
с ключевым словом asScala
.
Вопрос 2. Существует ли конструкция, похожая на JavaConverters
, в RxScala? Это сделало бы приведенный выше код намного чище, я бы сказал:
import rx.lang.scala.JavaConverters._ // this class doesn't exist!
JavaFxObservable.fromObservableValue(textfield.textProperty())
.asScala
.map(s => /* do something */)