【问题标题】:RxKotlin flattenAsObservable(): type mismatch with method referenceRxKotlin flattenAsObservable():类型与方法引用不匹配
【发布时间】:2017-05-29 15:15:43
【问题描述】:

我正在将一些 Java 代码转换为 Kotlin,但在使用 flattenAsObservable() 时遇到了一些问题

Java 中的代码如下所示:

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

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

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>)

【问题讨论】:

    标签: kotlin rx-kotlin


    【解决方案1】:

    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 }
    

    【讨论】:

      猜你喜欢
      • 2019-05-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-24
      • 1970-01-01
      • 2010-09-20
      相关资源
      最近更新 更多