RxKotlin flattenAsObservable (): несоответствие типа с ссылкой на метод

Я конвертирую код Java в Kotlin, и у меня возникают проблемы с flattenAsObservable()

Вот как выглядит код в Java:

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

Вот что я имею в Котлине:

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

Он подчеркивает второй searchResults и дает мне следующую ошибку:

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

Я могу заменить

 .map { RootSearchResponse::searchResults } 

с

 .map { searchResponse -> searchResponse.searchResults } 

и он будет работать. Как правильно обращаться к методу? Или в чем причина того, что я не могу в этом случае?

RootSearchResponse:

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

RootSearchResponse::searchResults – это ссылка на метод. Вместо того, чтобы передавать это функции map , используя {} , вы передаете лямбду, которая всегда возвращает эту ссылку на метод.

В основном, вы сопоставляете каждый входящий элемент с этой ссылкой метода с вашей операцией с map , вместо того, чтобы применять этот метод к каждому элементу, как вы хотели бы. Таким образом, входящие параметры вашего метода flattenAsObservable всегда являются той же ссылкой на метод searchResults , который является KProperty1 .

Чтобы применить метод, который вы ссылаетесь на каждый элемент, вы можете передать ссылку на метод в обычных круглых скобках, например:

 .map(RootSearchResponse::searchResults) 

Для дополнительного простого примера того, что происходит с лямбдой:

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

Эта операция будет отображать каждый элемент в 2 , и вы получите список, содержащий только пять раз. Это в основном просто сокращение для следующего, просто без явного имени параметра:

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