Java 8 完全未来java 8了解应用点

Java 8 完全未来java 8了解应用点,java-8,Java 8,我正在尝试重构Java8代码,以提高可读性,并能够调试代码。我有一个函数,它返回映射的CompletionStage,key作为字符串,value作为someItem return response.thenApplyAsync( r -> { Map<String, someItem> result = new HashMap<>(); // The result can be null

我正在尝试重构Java8代码,以提高可读性,并能够调试代码。我有一个函数,它返回映射的CompletionStage,key作为字符串,value作为someItem

 return response.thenApplyAsync(
        r -> {
            Map<String, someItem> result = new HashMap<>();

            // The result can be null
            if (r != null) {
                result = r.getItemList().stream().collect(
                    Collectors.toMap(
                        x -> x.getFirstBlock().getSomevalue(), Function.identity(),
                        // check and warn for duplicates
                        (p1, p2) -> {
                            LOGGER.warn(String.format("duplicate some value found: %s",
                                    p1.getFirstBlock().getSomevalue()));

                            return p1;
                        })
                );
            }
            return result;
        }
    );
返回响应。然后应用同步(
r->{
映射结果=新的HashMap();
//结果可以为空
如果(r!=null){
结果=r.getItemList().stream().collect(
汤姆(
x->x.getFirstBlock().getSomevalue(),Function.identity(),
//检查并警告是否存在重复项
(p1,p2)->{
LOGGER.warn(String.format(“找到的某些值重复:%s”),
p1.getFirstBlock().getSomevalue());
返回p1;
})
);
}
返回结果;
}
);
我将代码重构为:

try {
        someItem1 respVal=response.toCompletableFuture().get();

        List<someItem> itmLst=respVal.getItemList();


        Map<String, someItem> result=new HashMap<String, someItem>();

        for(someItem itm:itmLst){
            if(result.containsKey(itm.getFirstBlock().getSomevalue())){
                LOGGER.warn(String.format("duplicate some value found: %s",itm.getFirstBlock().getSomevalue()));
            }else{
                result.put(itm.getFirstBlock().getSomevalue(),itm);
            }

        }

        return CompletableFuture.completedFuture(result);

    } catch (InterruptedException|ExecutionException e) {
        e.printStackTrace();
    } 
    return null;
试试看{
someItem1 respVal=response.toCompletableFuture().get();
List itmLst=respVal.getItemList();
映射结果=新的HashMap();
对于(某些项目itm:itmLst){
if(result.containsKey(itm.getFirstBlock().getSomevalue()){
LOGGER.warn(String.format(“找到的某些值重复:%s”,itm.getFirstBlock().getSomevalue());
}否则{
put(itm.getFirstBlock().getSomevalue(),itm);
}
}
返回CompletableFuture.completedFuture(结果);
}捕获(中断异常|执行异常e){
e、 printStackTrace();
} 
返回null;
我真的不确定通过进行上述重构会产生什么影响。确切地说,我需要知道是否只对最终结果使用CompletableFuture与将整个CompletableFuture与apply async等一起使用完全相同。从oracle提供的文档中,我了解到apply async仅用于使用当前执行阶段的默认异步执行功能,但它是否同样适用于请求值的完整未来。非常感谢您的帮助。
请注意,try-catch只是我的方法的异常处理的一部分,我还没有展示。

然后applyasync
链接一个依赖的操作而不执行它。调用
get()
意味着等待计算完成并获得结果,然后立即执行后续代码。这怎么可能是一样的?@Holger我更关心的是总体结果。使用completedFuture而不是应用then combine/apply async是否是一种好的做法。目前,我的执行时间不受使用其中一个的影响。我想知道的是,通过使代码更具可调试性/可读性,然后应用一个完整的未来,这是一个比原始代码分解更好的实践。请建议。那么你的意思是,除了它违背了将一个操作链接到一个可能的异步操作的实际目的之外?好吧,如果那是你想要的,那没什么错。但是,如果您只想获得更易于调试/可读的代码,则无需更改应用程序逻辑。只需将lambda表达式的内容放入一个新方法中,并使用带有方法引用的
然后使用applyasync