无法理解Java 8中的一些lambda表达式

时间:2017-06-06 20:42:26

标签: java intellij-idea lambda casting java-8

我有这段代码看起来像这样而不使用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()中的postsFunction<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);
}

2 个答案:

答案 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表达式中使用该方法来测试是否是这种情况。如果聪明不添加演员 - 那就是问题所在。