Uso del map RXJava en Kotlin?

¿Por qué esto se queja de un señorita? map supone que el map debe transformar el valor de un observable en otro, pero está esperando que devuelva un valor observable del map

 override fun fetchExercises(): Observable<List<Exercise>> { return FirebaseDatabase.getInstance() .getReference("exercises") .observeSingleEvent() .map { snapshot: DataSnapshot? -> object: List<Exercise> // Error here return listOf<Exercise>() } } fun DatabaseReference.observeSingleEvent(): Observable<DataSnapshot> { return Observable.create(object : Observable.OnSubscribe<DataSnapshot> { override fun call(subscriber: Subscriber<in DataSnapshot>) { val valueEventListener = object: ValueEventListener { override fun onDataChange(snapshot: DataSnapshot?) { subscriber.onNext(snapshot) subscriber.onCompleted() } override fun onCancelled(error: DatabaseError?) { subscriber.onError(FirebaseDatabaseThrowable(error)) } } addListenerForSingleValueEvent(valueEventListener) } }) } 

Esta parte de tu código

 .map { snapshot: DataSnapshot? -> object: List<Exercise> 

dice que el tipo del parámetro de snapshot que este lambda recibe es DataSnapshot? -> object: List<Exercise> DataSnapshot? -> object: List<Exercise> (que en realidad no es un tipo de function válido, que sería DataSnapshot? -> List<Exercise> ).

Creo que lo que realmente quería hacer es lo siguiente, un parámetro de snapshot que solo tiene el tipo DataSnapshot :

 .map { snapshot: DataSnapshot? -> listOf<Exercise>() } 

El tipo de retorno de la lambda no tiene que especificarse aquí, solo se deducirá. Tampoco necesita usar la palabra key return en un lambda, porque la última expresión que contiene es la que se devuelve.

@ zsmb13 ha señalado la respuesta correcta allí mismo. Aquí, me gustaría comentar sobre algún error cometido en su expresión lambda.

 .map { snapshot: DataSnapshot? -> object: List<Exercise> // Error here return listOf<Exercise>() } 

object: List<Exercise> aquí no es una syntax válida ya que el cuerpo va después de un signo -> dentro de la expresión lambda. No especificamos el tipo de devolución dentro del cuerpo.

Además, el return aquí significa regresar de fetchExercises() como se describe en los documentos de Kotlin :

Una statement de devolución sin una label siempre regresa de la function declarada con la palabra key divertida. Esto significa que un retorno dentro de una expresión lambda regresará de la function adjunta, mientras que un retorno dentro de una function anónima regresará de la function anónima.

Como dijo @ zsmb13, el return no es necesario en la mayoría del caso. Si realmente lo desea (para control de flujo), puede usar declaraciones calificadas :

 //This is answer from @zsmb13 .map { snapshot: DataSnapshot? -> return@map listOf<Exercise>() } 
  • Tipo de devolución diferente en RxJava 2 (actualización desde RxJava1)
  • RxJava cómo agrupar elementos de una list en Map <Key, List <Value >>
  • RxJava zipCon error IDE en Kotlin con Android Studio 3.0
  • ¿Cómo se simula emitir 2 streams infinitas observables y tener otras observables que las fusionan y amortiguan cada 10 segundos?
  • ¿Expresar "súper" generics en los types funcionales de Kotlin?
  • Datos de caching de request HTTP en RxJava
  • Función de extensión de llamada dentro de la class Java como cualquier operador de RX
  • rx.Scheduler no se puede proporcionar sin un método @ Provides- o @ Produces-anotado
  • Cómo usar la class ContextWrapper con subscribeWith
  • MissingMethodInvocationException probando una class abierta en Kotlin
  • RxAndroid - Manejar errores con el operador Zip