简体   繁体   English

多个对于每个性能调整

[英]Multiple For each performance tuning

I want to iterate an object which has list inside list and so on.我想迭代一个 object ,其中包含列表等。 Since this data is huge in size, I want to exit all iterations when the if condition is met.由于这个数据很大,我想在满足 if 条件时退出所有迭代。

Since break is not supported in forEach, how can we achieve this?由于 forEach 不支持 break,我们如何实现这一点? Is there any better solution other than using forEach to increase performance?除了使用forEach来提高性能之外,还有什么更好的解决方案吗? Performance is key criteria here.性能是这里的关键标准。 Can I use streams / parallel streams here?我可以在这里使用流/并行流吗?

dataList.forEach(data -> data.getList()
    .forEach(data1 -> data1.getList()
        .forEach(data2 ->data2.getList()
           .forEach(data3 ->data3.getList()
              .forEach(data4 -> {
                  if (data4.getSomeData().equals(someData)) {
                    //some logic to populate some object using data1, data2, data3 & data4 fields
                   //I want to exit all the for each iterations if this condition is met. Since this list is very huge in size
                }
            })))));

It is possible to do this with a lot of flatmapping stages:可以通过很多平面映射阶段来做到这一点:

Optional<YourObject> mappedData = dataList.getList().stream()
    .flatMap(data -> data.getList().stream()
      .flatMap(d1 -> d1.getList().stream()
        .flatMap(d2 -> d2.getList().stream()
          .flatMap(d3 -> d3.getList().stream()
            .flatMap(d4 -> d4.getList().stream()
              .filter(d4.getSomeData().equals(someData))
              .map(d -> mapping(data, d1, d2, d3, d4, d))))))
    ).findFirst();

Another way would be using for-each loops in a method to do the short-circuting:另一种方法是在方法中使用 for-each 循环来进行短路:

private Optional<YourObject> foo(Data data) {
  for (Data d : data.getList()) {
    for (Data1 d1 : d.getList()) {
      for (Data2 d2 : d1.getList()) {
        for (Data3 d3 : d2.getList()) {
          for (Data4 d4 : d3.getList()) {
            if (d4.getSomeData().equals(someData)) {
              return Optinal.of(mapping(data, d1, d2, d3, d4));
            }
          }
        }
      }
    }
  }
  return Optional.empty();
}

or with a break statement on the most outer loop:或在最外层循环上使用 break 语句:

Optional<YourObject> yourObject = Optional.empty();
outer: for (Data d : data.getList()) {
  for (Data1 d1 : d.getList()) {
    for (Data2 d2 : d1.getList()) {
      for (Data3 d3 : d2.getList()) {
        for (Data4 d4 : d3.getList()) {
          if (d4.getSomeData().equals(someData)) {
            yourObject = Optional.of(mapping(data, d1, d2, d3, d4));
            break outer;
          }
        }
      }
    }
  }
}

Performance is very similar for - traditional for and forEach operation most of the cases.性能非常相似 -传统的 forforEach操作在大多数情况下。 So you can use traditional for operation in that case.所以在这种情况下你可以使用传统的进行操作。 You can now propagate break over every loop.您现在可以在每个循环上传播中断

Demo code:演示代码:

boolean killSwitch = false;
for(;i < size && !killSwitch; i++){
   for( ;j < size && !killSwitch; j++){
       for(;k < size && !killSwitch; k++){
            if(condition == true){
                killSwitch = true;
            }
       }
   }
}
dataList.forEach(
                data -> data.forEach(
                    data1 -> data1.forEach(
                            data2 -> data2.stream().
                                    filter(data2.getSomeData().equals(someData)).
                                    findFirst().
                                    ifPresentOrElse(data2.doSomethingMethod()), () -> {
                                //do failed code
                                return 0;
                            })
                    )
        );

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM