使用java 8 lambda表达式的嵌套多数组迭代的等效表达式

时间:2017-07-14 07:20:32

标签: java lambda java-8

我正在考虑为这次迭代制作java 8编码的方法:

if(rules.size()>0){
    for (int i=0;i<rules.size();i++) {
        for(AbstractProductInterface product:products){
          if(rules.get(i).getProductsToApply().contains(product.getClass()){
                productDiscounts.add(new ConcreteProductDecorator(product, rules.get(i),conditions.get(i)));
          }     
        }
    }   

2 个答案:

答案 0 :(得分:2)

首先我会在这里再说一遍,那些令人反感的评论真的不好,请删除它们。

其次,您的代码依赖于索引,而您使用Stream选择的任何解决方案都会非常难看且不可读取,与您目前的简单for循环相比。

我只能假设这样可行(我没有编译它,因为你既没有提供类也没有提供一些测试数据):

IntStream.range(0, rules.size())
            .boxed()
            .flatMap(x -> products.stream()
                    .filter(p -> rules.get(x).getProductsToApply().contains(p.getClass()))
                    .map(y -> new AbstractMap.SimpleEntry<>(x, y)))
            .map(e -> new ConcreteProductDecorator(e.getValue(), rules.get(e.getKey()), conditions.get(e.getKey())))
            .collect(Collectors.toList());

将此详细程度与您现有的任何内容进行比较......

答案 1 :(得分:0)

您可以像在Java 8中一样重写迭代

    if (rules.size() > 0) {
      IntStream.of(rules.size()).forEach(i -> products.stream().filter(product -> rules.get(i).getProductsToApply().contains(product.getClass())).forEach(product -> productDiscounts.add(new ConcreteProductDecorator(product, rules.get(i), conditions.get(i)))));
    }