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 }