这个链接(https://www.jianshu.com/p/6f3ee90ab7d3)很系统的解释了CompletableFuture接口,我只是补充一个方法
CompletableFuture<Void> allOf(CompletableFuture<?>... cfs)这个方法可以连接多个多个CompletableFuture合并成一个CompletableFuture
贴上我们大神的代码。
@Override public ManageStatistics bannerStatistics(Date startDate, Date endDate, Long departmentId) throws ExecutionException, InterruptedException { CompletableFuture<ResultSet<Long, State>> departmentsFuture = CompletableFuture.supplyAsync(() -> departmentService.findSubDepartmentsAndMe(null, departmentId) ); CompletableFuture<List<Truck>> truckFuture = departmentsFuture.thenApplyAsync(departmentSet -> { List<Long> departmentIds = departmentSet.getData(); return truckService.findTrucks(null, departmentIds, TruckType.TRACTOR); }); CompletableFuture<ManageStatistics> manageStatisticsFuture = departmentsFuture.thenApplyAsync(departmentSet -> { List<Long> departmentIds = departmentSet.getData(); ManageStatistics manageStatistics = manageStatisticsService.findStatistics(startDate, endDate, departmentIds); return manageStatistics; } ); //查询发生运输的车辆总总数 CompletableFuture<List<Map<String, Long>>> runningTruckFuture = departmentsFuture.thenApplyAsync(departmentSet -> { List<Long> departmentIds = departmentSet.getData(); return waybillService.countRunningTruckForStatistic(startDate, endDate, departmentIds); } ); CompletableFuture combine1Future = manageStatisticsFuture.thenAcceptBoth(truckFuture, (manageStatistics, trucks) -> { //空指针异常 if (manageStatistics != null && trucks != null && trucks.size() > 0) { manageStatistics.setPerTruckNum(StatisticsUtil.null2Zero(manageStatistics.getWaybillNum()) / trucks.size());//单车次数 manageStatistics.setPerTotalMileage(StatisticsUtil.null2Zero(manageStatistics.getTotalMileage()) / trucks.size());//单车总里程 manageStatistics.setPerHeavyMileage(StatisticsUtil.null2Zero(manageStatistics.getHeavyMileage()) / trucks.size());//单车重车里程 } }); CompletableFuture combine2Future = manageStatisticsFuture.thenAcceptBoth(runningTruckFuture, (manageStatistics, truckNumMap) -> { int truckNum = 0; for (Map<String, Long> num : truckNumMap) { truckNum += num.get("nums"); } if (manageStatistics != null && truckNum > 0 && manageStatistics.getWaybillNum() != null && manageStatistics.getWaybillNum() != 0) { manageStatistics.setPerTotalWeight(StatisticsUtil.null2Zero(manageStatistics.getTotalWeight()) / truckNum);//单车总运量 (账号所属机构下辖车辆的运输装载量总和)/(账号所属机构下辖发生运输的车辆数量) manageStatistics.setPerLoadWeight(StatisticsUtil.null2Zero(manageStatistics.getLoadWeight()) / truckNum / manageStatistics.getWaybillNum());//单车总装载量 (账号所属机构下辖车辆的运输装载量总和)/(账号所属机构下辖发生运输的车辆数量)/(账号所属机构下辖车辆发生运输的次数) manageStatistics.setPerTurnover(StatisticsUtil.thousandUnitUp(StatisticsUtil.null2Zero(manageStatistics.getHeavyMileage())) * StatisticsUtil.milionUnitUp(StatisticsUtil.null2Zero(manageStatistics.getPerTotalWeight())) / truckNum);//单车重车里程 (∑账号所属机构下辖车辆的单车运输装载量*账号所属机构下辖车辆的运输重驶里程)/(账号所属机构下辖发生重驶运输的车辆数量) } }); CompletableFuture combineFuture = CompletableFuture.allOf(combine1Future, combine2Future); combineFuture.get(); return manageStatisticsFuture.get(); }