2017-11-10 15 views
2

새로운 API 개발 작업의 일환으로 Kotlin을 사용하는 법을 배우고 있습니다. 처음에는 Kotlin API가 Java (Android) 프로젝트 내에서 사용되기를 원하지만 장기적으로 Kotlin을 완전히 채택하기를 바랍니다.Java에서 Kotlin 채널 제작자를 쉽게 소비하는 방법은 무엇입니까?

장기 실행 프로세스의 구현을 개선하기 위해 coroutines를 사용하고 싶습니다. 특히 kotlinx.courtines 패키지의 channel producer

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

자바이 소비하는 가장 좋은 방법은 무엇입니까 : 예를 들어

? 나는 Kotlin 및/또는 Java에 임시 "도우미"기능을 추가하는 것으로 괜찮습니다.

답변

2

자바로 채널을 상호 연결하는 가장 쉬운 방법은 리 액티브 스트림을 이용하는 것입니다. Rx와 Project Reactor는 모두 즉시 사용 가능합니다. 예를 들어, dependicies에 kotlinx-coroutines-rx2을 추가하고 rxFlowable 빌더를 사용 할 수 있습니다 :이 기능은 특히, 예를 들어, 사용 편의성 자바에서 설계되었습니다 Flowable의 인스턴스를 반환

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

을, 당신은 자바로 할 수 있습니다 :

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

필자는 내 경우에'rxObservable'을 사용하기로했지만 (나는 배압을 기대하지 않는다) 완벽하게 작동한다. –

0

현재 Java 8을 사용하고 람다를 사용할 수 있다고 가정 할 때 Kotlin에 정의 된 도우미 함수를 사용하여 콜백을 전달하여 들어오는 결과를 사용할 수 있습니다.

코 틀린의 도우미 방법 :

이 다음 자바에서 소비되는
fun exampleProducerCallback(callback: (String) -> Unit) = runBlocking { 
    exampleProducer().consumeEach { callback(it) } 
} 

: return Unit.INSTANCEcan be found in this answer가 필요한 이유에

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

설명.

+0

나는 코 틀린을 처음 접했고 이것이 관용적인지 아닌지 전혀 모른다. 나는 현재 내가 어디에 있는지 알 수 있도록 현재 솔루션을 게시했습니다. 아마도 더 좋은 대안이있을 수 있습니까? –

+1

분명한 개선점은'callback : Consumer '을 대신 사용하는 것입니다. –