这个链接(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();
}