RxKotlin flattenAsObservable():类型与方法引用不匹配

时间:2017-05-29 15:15:44

标签: kotlin rx-kotlin

我正在将一些Java代码转换为Kotlin,而我在使用+- Filter (isnotnull(pat#930) && (pat#930 = abcd)) +- FileScan parquet PartitionFilters: [], PushedFilters: [IsNotNull(pat), EqualTo(pat,abcd)]

时遇到了一些问题

这里是Java中代码的样子:

flattenAsObservable()

这是我目前在Kotlin所拥有的:

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 }

它会起作用。我如何正确引用方法?或者我在这种情况下无法理解的原因是什么?

RootSearchResponse:

.map { searchResponse -> searchResponse.searchResults }

1 个答案:

答案 0 :(得分:2)

RootSearchResponse::searchResults是方法参考。不是通过使用map将此传递给{}函数,而是传入一个始终返回此方法引用的lambda。

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

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

.map(RootSearchResponse::searchResults)

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

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

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

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