我有一个关于验证嵌套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)
我希望验证所有对象name和desc所有对象,而不是使用如下所示的嵌套循环:
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)
有没有更好的方法呢?
好吧,你绝对可以通过使用 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 是否可以为您带来任何好处,否则,上述内容就足够了。
| 归档时间: |
|
| 查看次数: |
840 次 |
| 最近记录: |