RxKotlin collectInto () MutableList usando references de método

El siguiente código es mi bash de convertir un ejemplo de RxJava en Kotlin. Se supone que debe recostackr un montón de Int en una MutableList , pero tengo una gran cantidad de errores.

 val all: Single<MutableList<Int>> = Observable .range(10, 20) .collectInto(::MutableList, MutableList::add) 

Los errores:

  Error:(113, 36) Kotlin: Type inference failed: Not enough information to infer parameter T in inline fun <T> MutableList(size: Int, init: (index: Int) -> T): MutableList<T> Please specify it explicitly. Error:(113, 49) Kotlin: One type argument expected for interface MutableList<E> : List<E>, MutableCollection<E> defined in kotlin.collections Error:(113, 67) Kotlin: None of the following functions can be called with the arguments supplied: public abstract fun add(element: Int): Boolean defined in kotlin.collections.MutableList public abstract fun add(index: Int, element: Int): Unit defined in kotlin.collections.MutableList 

Si cambio ImmutableList::add a ImmutableList<Int>::add , me deshago del error esperado del tipo de argumento, que se reemplaza por:

 Error:(113, 22) Kotlin: Type inference failed: fun <U : Any!> collectInto(initialValue: U!, collector: ((U!, Int!) -> Unit)!): Single<U!>! cannot be applied to (<unknown>,<unknown>) 

Esta es una copy directa de lo siguiente en Java:

 Observable<List<Integer>> all = Observable .range(10, 20) .collect(ArrayList::new, List::add); 

Entiendo que el primer error me dice que o bien inferir el tipo incorrecto y debo ser más explícito (¿dónde?), Pero pensé que ::MutableList sería el equivalente de () -> MutableList<Int> . El tercer error me dice que no puede llamar a ninguno de los methods add() con los arguments, pero de nuevo, pensé que MutableList::add es equivalente a { list, value -> list.add(value) } . El cuarto error me dice que no puede descifrar los types que se están aplicando al collector .

Si utilizo una expresión lambda en su lugar, no hay errores:

 val all: Single<MutableList<Int>> = Observable .range(10, 20) .collectInto(mutableListOf(), { list, value -> list.add(value) }) all.subscribe { x -> println(x) } 

Agradecería algunos comentarios sobre lo que estoy haciendo mal con las references al método, ya que claramente hay algo que he malentendido (mirando a través de Kotlin Language Reference , me pregunto si es una característica del idioma en este momento). Muy apreciado.

En su primer ejemplo, intenta aplicar el método signature de collect al de collectInto .

Esto nunca puede funcionar, ya que collect espera un Func0<R> y un Func0<R> Action2<R, ? super T> y collectInto espera que un object real y un BiConsumer<U, T> .
Una reference de constructor no puede funcionar para collectInto : necesitas un object real (por ejemplo, tu llamada mutableListOf() )

El segundo problema es que Kotlin está esperando un object BiConsumer y no una function. No estoy muy seguro de por qué. Aparentemente Kotlin no puede manejar múltiples generics para lambdas y reference de function de SAM-Interfaces.

Por lo tanto, debe pasar una instancia de BiConsumer y no solo una function.
También es por eso que pregunté en el comentario si está seguro del post de error:

 range(10, 20).collectInto(mutableListOf(), { l, i -> l.add(i) }) 

me dará un error, mientras

 range(10, 20).collectInto(mutableListOf(), BiConsumer { l, i -> l.add(i) }) 

costumbre.

  • Confusión de la syntax de Kotlin lambda
  • ¿Cómo corotines de Kotlin son mejores que RxKotlin?
  • RxAndroid, cómo detectar si observable ha finalizado la emisión
  • Cómo notificar a Observable cuando finalice CountdownTimer
  • Inyectar constructor y object complementario
  • Usando RxJava para unir datos locales con datos remotos (o en caching)
  • Múltiples requestes de modificación2 usando Flowable en Kotlin
  • Llamada asincrónica para cada elemento dentro de una colección
  • Para una function de Kotlin utilizada como expresión, ¿hay una forma concisa de operar y devolver un valor?
  • Kotlin con stack RxKotlinFX da un error de class de acceso
  • Repetir acciones en estado con RxJava