CompletableFuture 详解

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



猜你喜欢

转载自blog.csdn.net/u012817635/article/details/79758754