代码之家  ›  专栏  ›  技术社区  ›  Bofrostmann

3.每个循环嵌套为Java流(或更好的并行流)

  •  3
  • Bofrostmann  · 技术社区  · 8 年前

    在我目前正在进行的项目中,我们有三个嵌套的for循环:

    List<OutputDataType> resultList = new ArrayList<>();
    
    for (OrgStructureEntity product : products) {
    
           for (String region : regions) {
    
                    for (SalesType salesType : SalesType.values()) {
    
                        resultList.addAll(new SalesRequest(getConnection(),
                                product.getProductMainGroup(), product.getSbu(), planYear, currentPeriod, region, salesType,
                                exchangeRates).calculateSalesKpis());
                    }    
           }
    }
    

    产品和区域都是集合。 resultList是一个带有“OutputDataType”对象的ArrayList。 方法calculateSalesKpis()还返回“OutputDataType”对象列表。 所有这些对象都应该添加到结果列表中。我想用并行流来实现这一切,以使其更快,但我没有得到更多:

    products.stream()
                    .map(product -> regions.stream()
                            .map(region -> Arrays.stream(SalesType.values())
                                    .map(salesType -> new SalesRequest(getConnection(),
                                            product.getProductMainGroup(), product.getSbu(), planYear, currentPeriod, region, salesType,
                                            exchangeRates).calculateSalesKpis())))
                    .
    

    我不知道现在如何将其全部放在结果列表中,以及如何正确关闭流。 我希望你能帮助我:)

    1 回复  |  直到 8 年前
        1
  •  5
  •   Grzegorz Piwowarek    8 年前

    为了避免在流>,您需要展平嵌套 Stream 使用 flatmap 方法执行收集之前:

    products.stream()
      .flatMap(product -> regions.stream()
        .flatMap(region -> Arrays.stream(SalesType.values())
         .flatMap(salesType -> new SalesRequest(getConnection(),
           product.getProductMainGroup(), product.getSbu(), planYear, currentPeriod, region, salesType, exchangeRates).calculateSalesKpis().stream())))
      .collect(Collectors.toList())
    
                .