Как легко потреблять продюсера канала Kotlin на Java?

В рамках работы над разработкой нового API я изучаю использование Kotlin. Первоначально я хочу, чтобы API Kotlin использовался в проекте Java (Android), но в долгосрочной перспективе я надеюсь полностью принять Котлина.

В рамках улучшения реализации долговременного процесса я хочу использовать сопрограммы. В частности, производитель канала из пакета kotlinx.courtines .

Например:

 fun exampleProducer() = produce { send("Hello") delay(1000) send("World") } 

Каков наилучший способ использования этого в Java? Я согласен с добавлением временных «вспомогательных» функций в Kotlin и / или Java.

Самый простой способ взаимодействия каналов с Java – через реактивные потоки. И Rx, и Project Reactor поддерживаются в готовом виде. Например, добавьте kotlinx-coroutines-rx2 в свои зависимости, и вы сможете использовать rxFlowable builder:

 fun exampleFlowable() = rxFlowable<String> { send("Hello") delay(1000) send("World") } 

Эта функция возвращает экземпляр Flowable , который специально разработан для упрощения использования Java, например, вы можете делать в Java:

 exampleFlowable().subscribe(t -> System.out.print(t)); 

В настоящее время, если использовать Java 8 и доступны lambdas, я полагаюсь на вспомогательную функцию, определенную в Kotlin, которая позволяет передавать обратный вызов, чтобы потреблять входящие результаты.

Вспомогательный метод в Котлине:

 fun exampleProducerCallback( callback: (String) -> Unit ) = runBlocking { exampleProducer().consumeEach { callback( it ) } } 

Затем он потребляется на Java как:

 ApiKt.exampleProducerCallback( text -> { System.out.print( text ); return Unit.INSTANCE; // Needed since there is no void in Kotlin. } ); 

Объяснение о том, почему return Unit.INSTANCE можно найти в этом ответе .

Intereting Posts
Ошибка Spring MVC 404 Плохой запрос Kotlin Интеллектуальная переменная литья в обходном пути lambda kotlin error: Parceler: невозможно найти генератор чтения / записи для типа io.realm.RealmList Добавить функцию расширений в класс Math в kotlin Двоичная конвертация Int в Float в Котлин Как написать надлежащий тест для реактивного репозитория интерфейса, который возвращает Observable только в том случае, когда есть какое-то событие, как издеваться над запуском этого события Firebase Admin SDK не может подключаться к базе данных из внутреннего файла jar MVVM привязывается к Android Значок значка меню Kotlin Jooq-транзакции: соединения не выводятся в пул, если исключение выбрано в транзакции Параметр не соответствует; SimpleXML Mapbox GeoJSON в неправильном положении Получите дополнительную строку от активности Kotlin Конфигурация проекта котла в Gradle с помощью Gradle Script Kotlin Spring Security несколько успешных поставщиков аутентификации