Confusión de la syntax de Kotlin lambda

Estoy confundido por la syntax lambda de Kotlin.

Al principio, tengo

.subscribe( { println(it) } , { println(it.message) } , { println("completed") } ) 

que funciona bien

Luego moví el onNext a otra class llamada GroupRecyclerViewAdapter que implementa Action1<ArrayList<Group>> .

 .subscribe( view.adapter as GroupRecyclerViewAdapter , { println(it.message) } , { println("completed") } ) 

Sin embargo, recibí el error:

error

 Error:(42, 17) Type mismatch: infernetworking type is () -> ??? but rx.functions.Action1<kotlin.Throwable!>! was expected Error:(42, 27) Unresolved reference: it Error:(43, 17) Type mismatch: infernetworking type is () -> kotlin.Unit but rx.functions.Action0! was expected 

Puedo arreglar el error cambiando a:

 .subscribe( view.adapter as GroupRecyclerViewAdapter , Action1<kotlin.Throwable> { println(it.message) } , Action0 { println("completed") } ) 

¿Hay alguna manera de escribir el lambda sin especificar un tipo? ( Action1<kotlin.Throwable> , Action0 )

Nota: suscribirse es el método RxJava

Editar 1

 class GroupRecyclerViewAdapter(private val groups: MutableList<Group>, private val listener: OnListFragmentInteractionListener?) : RecyclerView.Adapter<GroupRecyclerViewAdapter.ViewHolder>(), Action1<ArrayList<Group>> { 

view.adapter as GroupRecyclerViewAdapter debe ser lambda func, no Action, ya que onError y onComplete también lambdas

entonces, para solucionar este bash:

 .subscribe( { (view.adapter as GroupRecyclerViewAdapter).call(it) } , { println(it.message) } , { println("completed") } ) 

con sus nombres (reemplace la Unit con su tipo)

 class GroupRecyclerViewAdapter : Action1<Unit> { override fun call(t: Unit?) { print ("onNext") } } 

con lambdas

 val ga = GroupRecyclerViewAdapter() ...subscribe( { result -> ga.call(result) }, { error -> print ("error $error") }, { print ("completed") }) 

con acciones

 ...subscribe( ga, Action1{ error -> print ("error $error") }, Action0{ print ("completed") }) 

elegir uno

Tiene dos versiones del método de subscribe para elegir:

  • El primero (el real) tiene la firma de subscribe(Action1<ArrayList<Group>>, Action1<Throwable>, Action0) .
  • La segunda versión es generada por el comstackdor de Kotlin y tiene la firma de subscribe((ArrayList<Group>>) -> Unit, (Throwable) -> Unit, () -> Unit)

En su código, sin embargo, pasa los siguientes types de parameters:

 subscribe( view.adapter as GroupRecyclerViewAdapter, // Action1<Throwable> { println(it.message) }, // (Throwable) -> Unit { println("completed") } // () -> Unit ) 

Como puede ver, estos types de parameters no satisfacen ninguna de las firmas disponibles. La otra respuesta te brinda algunas soluciones a tu problema. Además, puede hacer que GroupRecyclerViewAdapter implemente el tipo funcional Function1<ArrayList<Group>, Unit> (también son interfaces) en lugar de Action1<ArrayList<Group>> .

  • No se puede 'observar en' hilo principal con RxKotlin
  • ¿Puedo crear un método de extensión Kotlin para agregar una suscripción rxJava a una suscripción compuesta?
  • ¿Cómo leer JSON desde Url usando kotlin Android?
  • Cómo pasar nulo a un Observable con tipo anulable en RxJava 2 y Kotlin
  • Llamada asincrónica para cada elemento dentro de una colección
  • RxJava - ¿Entradas de keyboard de contrapresión?
  • RxKotlin - Single.just () no se emite al suscribirse TestSubscriber
  • RxJava2 Tal vez devuelva Observable vacío si no hay elemento
  • RxKotlin - matriz de observadores dynamics
  • RxJava- Gire Observable en Iterator, Stream o Sequence
  • No se puede cambiar el text de ActionMenuItemView con RxKotlin