La reference obligatoria enlazada no funciona con Reactor Subscribe

Desde 1.1, Kotlin ha tenido references obligatorias bindings . Como estoy en 1.1.3, creo que debería poder usar lo siguiente para acceder al método add :

 val elements = mutableListOf<Int>() Flux.just(1, 2, 3, 4) .log() .subscribe(elements::add) 

Sin embargo, esto arroja un error:

elementos :: agregar error

No estoy seguro de lo que significa ese error en esta instancia específica. Puedo usar .subscribe({ elements.add(it) }) sin problemas, pero ¿no debería poder usar los elements::add versión?

La expresión de reference de la function Kotlin no es como la expresión de reference del método java. el tipo de devolución Any no es compatible con el tipo de devolución Unit .

el error proviene del tipo de retorno ( boolean ) del MutableList#add(Int) no es compatible con el parámetro tipo de parámetro (Int)->Unit del método de subscribe . entonces solo puedes usar la expresión lambda de esta manera.

puede usar list::add in somewhere cuando los types de parameters y el tipo de retorno son compatibles con la function. por ejemplo:

 val add1:(Int) -> Boolean = list::add; // MutableList.add(Int); val add2:(Int,Int) -> Unit = list::add; // MutableList.add(Int,Int); 

Para reformular y elaborar en la otra respuesta: el problema es que se espera un Consumer , que toma un elemento y no devuelve nada en su único método. El tipo de function correspondiente para esto en Kotlin sería (T) -> Unit .

Sin embargo, el método add descrito en la interfaz MutableList tiene el tipo (T) -> Boolean : devuelve verdadero si el elemento se agregó con éxito (esto es para admitir implementaciones de la interfaz que no pueden contener duplicates).

Una posible solución a esto es agregar un método de extensión que agrega un elemento a una MutableList sin devolver nada:

 fun <T> MutableList<T>.addItem(element: T): Unit { this.add(element) } 

A continuación, puede usar una reference obligatoria obligatoria a esta extensión, al igual que otros methods MutableList :

 Flux.just(1, 2, 3, 4) .log() .subscribe(elements::addItem) 
  • Rx-Kotlin awaitTerminalEvent nunca se sube a Completo
  • Comportamiento de RxJava Schedulers.immediate () mientras testings unitarias
  • Cambios en el valor de ObservableField no propagados
  • Kotlin: ¿Qué hacen los operadores más / less unarios con los numbers?
  • ¿Cómo conservar los nombres de los parameters para la debugging?
  • Android Espresso IntentsMatcher funciona en un dispositivo nuevo pero no antiguo
  • ¿Cómo invocar explícitamente el bloque de inicio de un object?
  • PubNub suscribe Android Kotlin
  • Companion se beneficia de la posibilidad de implementar interfaces
  • El context no se puede proporcionar sin un método @ Provides- o @ Produces-anotado en kotlin
  • Osmdroid y Osmdroid bonuspack cómo usar CacheManager