减少嵌套 for 循环

Reducing nested for loop

我的嵌套 for 循环如下所示:

for(int i=0; i<productGroups.size(); i++) {
     for(int j=0; j<productGroups.get(i).getProducts().size(); j++) { 
        AmountEntity storageValue = productGroups.get(i).getStorageValue();
        productGroups.get(i).getProducts().get(j).setQuantity(storageValue);
      }
}

我很确定必须有一种更有效的方法来做到这一点而不会产生 n² 复杂性。

productGroup 是一个 List,里面有 Products List,我只是遍历两个列表来设置数量。

如果有人能在这里帮助我,我会很高兴。

如果您想为所有产品组中的所有产品设置一个值,您将需要访问每个产品组。多少?好吧,如果您在每个产品组中有 x 个产品组和 y 个产品(为了论证),那么您将需要访问 x * y 个产品。没有办法解决这个问题。不过,您可以使代码更简洁、更易读,这通常更重要:

for(ProductGroup productGroup : productGroups) {
    AmountEntity storageValue = productGroup.getStorageValue();
    for(Product product : productGroup.getProducts()) {
        product.setQuantity(storageValue);
    }
}

或 lambda 形式:

productGroups.forEach(pg -> {
    AmountEntity storageValue = pg.getStorageValue();
    pg.getProducts().forEach(p -> p.setQuantity(storageValue));
});

请注意,productGroup 中的每个产品都获得相同的 storageValue,因此您可以在外部循环中定义该变量,如上所示。如果您可以更改域模型,您可能会问自己为什么无论如何都需要将 storageValue 从 productGroup 复制到每个产品,因为这基本上是冗余信息,但也许有一个很好的理由。

如果我看到这样的逻辑,我最初不会担心性能。调用 getter 和 setter 通常不是性能瓶颈。仅当您对数以百万计的产品执行此操作时,才可能需要一些时间。在那种情况下,解决方案不在于加速这些迭代,而是在于减少获取的产品数量(例如通过分页)。