2017-06-06 11 views
3

におけるいくつかのラムダ式のまわりで私の頭を取得できません私は、ラムダ式を使用せずに、このようなコードのこのスニペットを持っています:は、Java 8

.map((Function<List<Post>, List<Post>>) posts -> realm.where(Post.class).equalTo(DatabaseContract.PostTable.USER_ID, userId).findAll()) 
.onErrorResumeNext(throwable -> { 
    Log.d("rafael", throwable.getMessage()); 
    return getLocalPostsObservable(userId, page); 
}) 

私は理解していない何その理由

Function<List<Post>, List<Post>>postsから map()で型キャスト同時に、第二の発現には型キャストはありません

throwable -> { 
    Log.d("rafael", throwable.getMessage()); 
    return getLocalPostsObservable(userId, page); 
} 
+4

キャストを削除してみましたか? 'findAll()'の戻り値の型は何ですか? – shmosel

+0

@shmosel奇妙なことは、キャストを取り除いたときです。何も文句を言うことはありません。 'findAll()'は 'RealmResults 'を返します。 –

+0

コンパイラの型推論には、キャスティングコンテキストを提供することです。あなたが問題なくキャストを取り除くことができれば、これはそのようなケースではありませんが、ヒューリスティックなIntelliJのマクロがそのようなキャストを挿入するかどうかを決定するために使用する... – Holger

答えて

2

findAll()の戻り値の型は何ですか?

Function<S, T>の返品タイプに応じてList<Post>にベットします。

Function<S, T>へのキャストは、postsパラメータまたはその戻り値だけでなく、ラムダ式全体に適用されると思います。

その存在理由は、map(FunctionLike<S, T>)のあいまいな呼び出しを避けることです。そうしないと、コード生成ツールが無駄なものを追加することは初めてではありません。

1

それがキャストされpostsはありませんが、全体のラムダ式と、それがコンパイルを失敗しないために、我々はpostsはタイプList<Post>findAllの実際であると推測することができもList<Post>を返しています。

はそれが好きなのでの の連鎖方法が考えられます。

where(..).equalTo(..).findAll(..) 

これは代わりにそのメソッドを使用しList<Post>を返すメソッドの内部で、あなたのラムダ式内でそのコードを取ることによってケースがある場合は、テストすることができます。 intelliがキャストを追加しない場合、問題はそこにあります。