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函数,而是传递一个总是返回此方法引用的lambda表达式。

基本上,您将每个传入的元素映射到您的map操作的方法引用,而不是像你想要的那样将该方法应用于每个元素。 因此, flattenAsObservable方法的传入参数始终与searchResults方法(它是KProperty1引用相同。

要将引用的方法应用于每个元素,可以在正则括号中传递方法引用,如下所示:

 .map(RootSearchResponse::searchResults) 

有关lambda发生了什么的另一个简单例子:

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

这个操作会将每个元素映射到2 ,并且最终会得到一个只包含5次5的列表。 基本上只是下面的简写,没有明确的参数名称:

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