Java 8替代方法,用于验证多个嵌套循环内的数据

had*_*des 7 java java-8

我有一个关于验证嵌套for循环中的数据的问题.

public class Object1{
  private String obj1Name;

  private String obj1Desc;

  private List<Object2> object2List;

  //Setters and getters
}


public class Object2{
  private String obj2Name;

  private String obj2Desc;

  private List<Object3> object3List;

  //Setters and getters
}

public class Object3{
  private String obj3Name;

  private String obj3Desc;
  //Setters and getters
}
Run Code Online (Sandbox Code Playgroud)

我希望验证所有对象namedesc所有对象,而不是使用如下所示的嵌套循环:

List<Object1> object1List = getObject1List();

for(Object1 object1 : object1List ){
   if(object1.getObj1Name() == null){
     //throw error
   }

   if(object1.getObj1Desc() == null){
     //throw error
   }

   for(Object2 object2 : object1.getObject2List()){
        if(object2.getObj2Name() == null){
            //throw error
        }

        if(object2.getObj2Desc() == null){
            //throw error
        }

        //loop Object 3 ...
   }
}
Run Code Online (Sandbox Code Playgroud)

有没有更好的方法呢?

Ous*_* D. 1

好吧,你绝对可以通过使用 Stream API 来避免“嵌套”:

if(object1List.stream()
                .anyMatch(a -> a.getObj1Name() == null ||
                        a.getObj1Desc() == null)){
    // throw error
}else if(object1List.stream()
                .anyMatch(a -> a.getObject2List().stream()
                       .anyMatch(b -> b.getObj2Name() == null ||
                                            b.getObj2Desc() == null))){
    // throw error
}else if(object1List.stream()
                .anyMatch(a -> a.getObject2List().stream()
                        .anyMatch(b -> b.getObject3List().stream()
                                .anyMatch(c -> c.getObj3Name() == null ||
                                                      c.getObj3Desc() == null)))){
     // throw error
}
Run Code Online (Sandbox Code Playgroud)

另一种方法更紧凑,但效率可能较低:

boolean result = object1List.stream()
                .flatMap(a -> a.getObject2List().stream()
                        .flatMap(b -> b.getObject3List().stream()
                                .flatMap(c -> Stream.of(a.getObj1Name(),
                                        a.getObj1Desc(), b.getObj2Name(),
                                        b.getObj2Desc(), c.getObj3Name(), c.getObj3Desc()))))
                .anyMatch(Objects::isNull); 

if(result){ // throw error }
Run Code Online (Sandbox Code Playgroud)

因此,要得出结论,如果性能是一个问题,那么请继续您的方法,或者尝试看看并行流 API 是否可以为您带来任何好处,否则,上述内容就足够了。

  • 对我来说,这比OP的方法更糟糕 (6认同)
  • 是的,[平面地图那屎](/sf/ask/599167621/)。 (2认同)