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>() } 
  • ¿Cómo crear caching / versión caliente de rx.Single?
  • retryWhen () no llama a lo que está dentro de Observable.just ()
  • Rxjava retrofit parse api error para el usuario
  • RxJava Debounce onNext ()
  • Cómo get un tipo correcto al devolver Template <T?> Desde una function estática con null
  • Métodos generics de Kotlin y inheritance
  • Cómo llenar una vista de list usando Kotlin, retroadaptación y RXjava
  • Comportamiento de RxJava Schedulers.immediate () mientras testings unitarias
  • Retrofit2 y kotlin
  • Kotlin: ¿Qué significa "return @"?
  • Kotlin cuádruple, quíntuple, etc. para desestructurar