基本介绍
Stream 对于一般集合的流式处理,简化代码的书写复杂的。
介绍文章 链接
CompletableFuture 封装的多线程处理方式,可以替代一般的 ExecutorService 执行任务,同时提供多种方法应对多线程场景。
介绍文章 链接
连用场景
批量处理任务并且任务内容复杂度较高,同时使用 List 的 stream 简化写法,但可读性可能会变差。
// 业务数据为 listObject 也是本次要处理的List 集合对象
List<CompletableFuture<MyPerson>> completableFutureList = listObject.stream().map(item -> CompletableFuture.supplyAsync(() -> {
// 业务处理
System.out.println(item);
// 业务处理每一条记录最终返回结果
return item;
})).collect(Collectors.toList());
// 等待所有结束
CompletableFuture.allOf(completableFutureList.toArray(new CompletableFuture[0])).join();
// 获取结果
List<MyPerson> collect1 = completableFutureList.stream().map(CompletableFuture::join).collect(Collectors.toList());
// 处理业务结果
System.out.println("collect1 = " + collect1);
部分说明
listObject.stream().map 将List 中的每一个对象拿出并做对应的业务处理并返回处理结果,这里我简单写了 实际业务操作可能要调用其他 Service 完成业务操作;
CompletableFuture.supplyAsync 使用异步线程处理,同时这种方式可以获得返回的结果
.map(item -> CompletableFuture.supplyAsync(() -> {
将每一个对象都提交到 CompletableFuture 中做异步处理。
.collect(Collectors.toList()) 将最终 CompletableFuture 处理的集合结果以List 方式返回。
CompletableFuture.allOf 等待其中的 completableFutureList 所有异步处理的结果返回。
.join()
完成后返回结果值,或引发异常,如果异常完成。
为了更好符合常用功能形式的使用,如果完成此任务所涉及的计算 CompletableFuture 抛出了一个异常,此方法抛出了一个 {@link CompletionException} 与底层异常是其原因。
completableFutureList.stream().map(CompletableFuture::join).collect(Collectors.toList())
将异步线程任务 completableFutureList 中未来的结果做Stream 流式处理, .map 处理未来结果的每条数据, .map(CompletableFuture::join) 处理未来结果的每条数据,处理的动作是 CompletableFuture::join 从任务中获取每一个任务的处理结果。
.collect(Collectors.toList()) 将 .map 处理的结果组合成List 并返回结果 List。