2017-05-29 1 views
1

Je conversion du code Java pour Kotlin et je vais avoir des problèmes avec flattenAsObservable()RxKotlin flattenAsObservable(): incompatibilité de type avec la méthode de référence

Voici ce que le code ressemblait en Java:

discogsInteractor.search(query) 
    .map(RootSearchResponse::getSearchResults) 
    .flattenAsObservable(searchResults -> searchResults) 
    .take(12) 

Voici ce que j'ai jusqu'à présent Kotlin:

discogsInteractor.search(query) 
    .map { RootSearchResponse::searchResults } 
    .flattenAsObservable<SearchResult> { searchResults -> searchResults } 
    .take(12) 

Il souligne la deuxième searchResults et me donne l'erreur suivante:

Required: (Mutable)Iterable<SearchResult!>! 
Found: KProperty1<RootSearchResponse, List<SearchResult>>! 

Je peux remplacer

.map { RootSearchResponse::searchResults } 

avec

.map { searchResponse -> searchResponse.searchResults } 

et cela fonctionnera. Comment puis-je correctement référencer la méthode? Ou quelle est la raison pour laquelle je ne peux pas dans ce cas?

RootSearchResponse:

data class RootSearchResponse(val pagination: Pagination, 
           @SerializedName("results") val searchResults: List<SearchResult>) 

Répondre

2

RootSearchResponse::searchResults est une référence de la méthode. Au lieu de passer à la fonction map, en utilisant {}, vous passez un lambda qui retourne toujours cette référence de méthode. Fondamentalement, vous mappez chaque élément entrant à cette référence de méthode avec votre opération map, au lieu d'appliquer cette méthode à chaque élément comme vous le souhaitez. Donc, les paramètres entrants de votre méthode flattenAsObservable sont toujours la même référence à la méthode searchResults, qui est un KProperty1.

Pour appliquer la méthode que vous faites référence à chaque élément, vous pouvez passer la référence de la méthode entre parenthèses régulières, comme ceci:

.map(RootSearchResponse::searchResults) 

Pour un exemple simple supplémentaire de ce qui se passe avec le lambda:

listOf(1, 2, 3, 4, 5).map { 2 } 

Cette opération tracerait tous les éléments à 2, et vous finiriez avec une liste qui ne contient que cinq 2 fois. C'est simplement un raccourci pour ce qui suit, juste sans un nom de paramètre explicite:

listOf(1, 2, 3, 4, 5).map { x -> 2 }