如何修复java lambda筛选器(缺少返回语句)与future

如何修复java lambda筛选器(缺少返回语句)与future,java,lambda,Java,Lambda,如何解决java lambda过滤器未来的收集 我得到了一个未来的集合,我想过滤掉集合中返回的假结果,但是使用lambda来报告(缺少return语句),我想得到一个类似于List的集合。我应该如何实现过滤 List<Future<Map<String, Object>>> future = childIds.getChildOrder() .stream() .map(i -> service.

如何解决java lambda过滤器未来的收集

我得到了一个未来的集合,我想过滤掉集合中返回的假结果,但是使用lambda来报告(缺少return语句),我想得到一个类似于
List
的集合。我应该如何实现过滤

List<Future<Map<String, Object>>> future = 
    childIds.getChildOrder()
            .stream()
            .map(i -> service.submit(new some(i)))
            .collect(Collectors.toList());

            future.stream().filter(i -> {
                try {
                    i.get().get("success").equals(Boolean.FALSE);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } catch (ExecutionException e) {
                    e.printStackTrace();
                }
            }).findAny().get().get();
列出未来=
childId.getChildOrder()
.stream()
.map(i->service.submit(新增部分(i)))
.collect(Collectors.toList());
future.stream().filter(i->{
试一试{
i、 get().get(“success”).equals(Boolean.FALSE);
}捕捉(中断异常e){
e、 printStackTrace();
}捕获(执行例外){
e、 printStackTrace();
}
}).findAny().get().get();


Map
结构看起来像这样的
{“success”:“false”,“msg”:“I get error”}

您必须在所有执行路径中都有返回语句:

future.stream().filter(i -> {
    try {
        return i.get().get("success").equals(Boolean.FALSE);
    } catch (InterruptedException e) {
        e.printStackTrace();
    } catch (ExecutionException e) {
        e.printStackTrace();
    }
    return false; // depending on what you wish to return in case of exception
}).findAny().get().get();

您可以一次性完成这项工作,并根据需要创建列表

包括返回值以消除IDE警告

List<Future<Map<String, Object>>> future =
        childIds.getChildOrder()
                .stream()
                .map(i -> service.submit(new Some(i)))
                .filter(i -> {
                    try {
                        return Boolean.FALSE.equals(i.get().get("success"));
                    } catch (InterruptedException | ExecutionException e) {
                        e.printStackTrace(); //try to use a logger instead
                    }
                    return false;
                })
                .collect(Collectors.toList());
列出未来=
childId.getChildOrder()
.stream()
.map(i->service.submit(新增部分(i)))
.filter(i->{
试一试{
返回Boolean.FALSE.equals(i.get().get(“success”);
}捕获(中断异常|执行异常e){
e、 printStackTrace();//尝试改用记录器
}
返回false;
})
.collect(Collectors.toList());

我真的想看看你在这里想做什么。可能有一种更简单的方法。

仍然令人担忧的是未来代码中的
get
s,并且对于最后执行的
get
而言,过滤器中的异常处理仍然是整个块的一部分!当然,
是可选的。无需检查即可获取
。[旁白]可读性:可以将catch块折叠为
catch(InterruptedException | ExecutionException e){e.printStackTrace();return false;}
为什么您甚至需要一个
映射
?然后检查
布尔值
。这里的
未来
s的用途是什么?除了Eran提出的修复lambda的建议外,您还需要重新审视使用此代码试图实现的目标。@Ocean请不要[修改当前问题只是为了添加新问题]。它使未来的读者感到困惑,并打断了已经发布的答案,因为他们并没有提到那个新问题。新问题应该单独发布。