不能让我的头周围的一些lambda表达式在Java中8
问题描述:
我有这样的代码片段看起来像这样不使用lambda表达式:不能让我的头周围的一些lambda表达式在Java中8
.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);
}
答
什么的
findAll()
返回类型?
根据Function<S, T>
的返回类型,我会在List<Post>
下注。
我的猜测是,将Function<S, T>
转换为整个lambda表达式,而不仅仅是posts
参数或其返回值。
至于其存在的原因,可能是为了避免map(FunctionLike<S, T>)
的模糊呼叫;否则,这将不是代码生成工具第一次添加一些无用的东西。
答
这并不是说被铸造的posts
,而是整个lambda表达式因为它不会失败编译我们可以推断,posts
实际上是List<Post>
型和findAll
也返回List<Post>
。
难道是因为链方法,如:
where(..).equalTo(..).findAll(..)
您可以测试,如果这是在冒险中返回List<Post>
的方法里面,你的lambda表达式中使用该方法的代码的情况。如果智能不添加演员阵容 - 问题就在那里。
您是否尝试删除演员?什么是findAll()的返回类型? – shmosel
@shmosel奇怪的是,当我删除投射它没有抱怨或任何事情,'findAll()'返回'RealmResults' –
有*编译器的类型推断需要帮助和一种方法来执行它的情况*是通过提供一个投射环境。如果您可以毫无问题地移除演员阵容,这并不是这种情况,但是谁知道,启发式IntelliJ的宏用于决定是否插入这样的阵容...... – Holger