【问题标题】:3 nested for-each loops as Java Stream (or better parallel stream)3 个嵌套的 for-each 循环作为 Java 流(或更好的并行流)
【发布时间】:2016-11-16 17:05:16
【问题描述】:

在我目前正在进行的项目中,我们有三个嵌套 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())))
                .

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

【问题讨论】:

  • 使用 .collect(Collectors.toList()) 终端操作将结果收集到列表中
  • 你的意思是最后一个点在哪里?不幸的是,这不起作用......

标签: java foreach java-8 java-stream flatmap


【解决方案1】:

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

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())

            .

【讨论】:

  • 那行不通。我认为这是因为 calculateSalesKpis() 不返回单个 OutputDataType 对象,而是返回 OutputDatatype 对象列表...
  • collect (java.util.stream.Collector super java.util.List,A,R>) 不能应用于 (java.util .stream.Collector,java.util.List>)
  • @Bofrostmann 我做了更多更改,但如果没有您的其余代码,这只是猜测。立即尝试
  • 我认为这现在可以工作了吗? resultList = products.stream() .flatMap(product -&gt; regions.stream() .flatMap(region -&gt; Arrays.stream(SalesType.values()) .flatMap(salesType -&gt; new SalesRequest(getConnection(), product.getProductMainGroup(), product.getSbu(), planYear, currentPeriod, region, salesType, exchangeRates).calculateSalesKpis().stream()))) .collect(Collectors.toList());
  • 同样的想法 :D 是的,谢谢!很抱歉格式错误.. Stack Overflow 还是新手..
猜你喜欢
  • 2021-06-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多