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:
- RxJava (Kotlin), Observable.amb y PublishSubject no están disparando
- RxKotlin - Single.just () no se emite al suscribirse TestSubscriber
- Rx-Kotlin awaitTerminalEvent nunca se sube a Completo
- Excepción causada por: java.lang.ClassNotFoundException: org.reactivestreams.Publisher
- Spring 5 and Kotlin 1.1 Coroutines: Type rx.Scheduler no presente
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.
- Cómo pasar nulo a un Observable con tipo anulable en RxJava 2 y Kotlin
- Obligatorio <Objeto> y encontrado <Objeto>?
- RxKotlin flattenAsObservable (): no coincide con el método de reference
- ¿Cómo puedo agregar de manera condicional una operación asincrónica en medio de una transmisión de RxJava?
- La biblioteca de Kotlin 'rxkotlin-0.21.0.jar' tiene un formatting no compatible. Actualice la biblioteca o el complemento
- RxKotlin - matriz de observadores dynamics
- RxJava2 Tal vez devuelva Observable vacío si no hay elemento
- ¿Cómo escalar dinámicamente el rebote de la stream de emisión de ráfagas?
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.
- Java.lang.ClassNotFoundException: no encontró la class Kotlin
- ¿Cómo crear una promise de kotlin.js.Promise nested?