我有这段代码看起来像这样而不使用lambda表达式:
.map(new Function<List<Post>, List<Post>>() {
@Override
public List<Post> apply(List<Post> posts) throws Exception {
return realm.where(Post.class).equalTo(DatabaseContract.PostTable.USER_ID, userId).findAll();
}
})
.onErrorResumeNext(new Function<Throwable, ObservableSource<? extends List<Post>>>() {
@Override
public ObservableSource<? extends List<Post>> apply(Throwable throwable) throws Exception {
Log.d("rafael", throwable.getMessage());
return getLocalPostsObservable(userId, page);
}
})
使用lambda表达式(使用Intellij特征转换),它变为:
.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);
})
我不明白为什么map()
中的posts
到Function<List<Post>, List<Post>>
中的类型转换
(Function<List<Post>, List<Post>>) posts -> realm.where(Post.class).equalTo(DatabaseContract.PostTable.USER_ID, userId).findAll()
同时在第二个表达式中没有类型转换:
throwable -> {
Log.d("rafael", throwable.getMessage());
return getLocalPostsObservable(userId, page);
}
答案 0 :(得分:2)
findAll()
的返回类型是什么?
我根据List<Post>
的返回类型在Function<S, T>
下注。
我的猜测是,Function<S, T>
的强制转换应用于整个lambda表达式,不仅适用于posts
参数,也适用于其返回值。
至于其存在的原因,可能是为了避免map(FunctionLike<S, T>)
的模糊呼吁;否则,它不会是代码生成工具第一次添加一些无用的东西。
答案 1 :(得分:1)
它不是被转换的posts
,而是整个lambda表达式,因为它不会使编译失败,我们可以推断出posts
实际上是类型List<Post>
并且findAll
也返回List<Post>
。
可能是因为链接方法,如:
where(..).equalTo(..).findAll(..)
您可以通过在返回List<Post>
的方法中使用该代码并在lambda表达式中使用该方法来测试是否是这种情况。如果聪明不添加演员 - 那就是问题所在。