2017-05-29 7 views
1

とのミスマッチ私はKotlinにいくつかのJavaコードを変換していると私はflattenAsObservable()RxKotlin 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 { searchResponse -> searchResponse.searchResults } 

.map { RootSearchResponse::searchResults } 

を置き換えることができ、それが動作します。どのように正しく参照するのですか?この場合、私はできない理由は何ですか?

RootSearchResponse:

data class RootSearchResponse(val pagination: Pagination, 
           @SerializedName("results") val searchResults: List<SearchResult>) 

答えて

2

RootSearchResponse::searchResultsメソッドリファレンスです。これを{}を使用してmap関数に渡す代わりに、このメソッド参照を常に返すラムダを渡します。

基本的には、あなたが望むようにそのメソッドをすべての要素に適用するのではなく、map操作ですべての着信要素をそのメソッド参照にマッピングしています。そのため、flattenAsObservableメソッドの入力パラメータは、searchResultsメソッドと常に同じです(KProperty1)。

はあなたがすべての要素を参照している方法を適用するには、そのように、通常の括弧内にメソッド参照を渡すことができます。

.map(RootSearchResponse::searchResults) 

をして何が起こっているかの追加の簡単な例についてラムダ:

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

この操作は2にすべての要素をマッピングするだろう、とあなただけ2 5を含むリストで終わるだろう回。基本的には、明示的なパラメータ名を省略しただけで、次のように略記できます。

listOf(1, 2, 3, 4, 5).map { x -> 2 } 
関連する問題