不能让我的头周围的一些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()类型转换,从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); 
} 
+4

您是否尝试删除演员?什么是findAll()的返回类型? – shmosel

+0

@shmosel奇怪的是,当我删除投射它没有抱怨或任何事情,'findAll()'返回'RealmResults ' –

+0

有*编译器的类型推断需要帮助和一种方法来执行它的情况*是通过提供一个投射环境。如果您可以毫无问题地移除演员阵容,这并不是这种情况,但是谁知道,启发式IntelliJ的宏用于决定是否插入这样的阵容...... – Holger

什么的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表达式中使用该方法的代码的情况。如果智能不添加演员阵容 - 问题就在那里。