我正在将一些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 }
答案 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 }