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:
- OnComplete nunca se llamó con toSortedList () y groupBy ()
- ¿Cómo escalar dinámicamente el rebote de la stream de emisión de ráfagas?
- RxKotlin - Single.just () no se emite al suscribirse TestSubscriber
- No se puede 'observar en' hilo principal con RxKotlin
- La suscripción de rx kotlin no funciona, no recibe artículos
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.
- Spring 5 and Kotlin 1.1 Coroutines: Type rx.Scheduler no presente
- RxKotlin flattenAsObservable (): no coincide con el método de reference
- No se puede cambiar el text de ActionMenuItemView con RxKotlin
- Inyectar constructor y object complementario
- RxKotlin - matriz de observadores dynamics
- Crear nueva instancia de object Kotlin
- Comportamiento con Kotlin Higher-Order Functions e interfaces de método único?
- RxJava- Gire Observable en Iterator, Stream o Sequence
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?