Java 8嵌套用于循环和条件
在Java8中将这个for循环简化为流时,我遇到了一些问题,流的输出与Java 8嵌套用于循环和条件,java,java-8,nested,Java,Java 8,Nested,在Java8中将这个for循环简化为流时,我遇到了一些问题,流的输出与for循环不匹配 for (Object1 ob1s : getObject1s){ if (ob1s.hasChild != null){ map1.get(ob1holder).add(ob1s); if(Objects.equals(ob1.getHolder, Boolean.TRUE)) {
for
循环不匹配
for (Object1 ob1s : getObject1s){
if (ob1s.hasChild != null){
map1.get(ob1holder).add(ob1s);
if(Objects.equals(ob1.getHolder, Boolean.TRUE))
{
map1.get(ob11holder).add(ob1s.getID);
}
if (ob1s.getObject2 != null){
for (Object2 ob2 : ob1s.getObject2.getObjects){
map.get(ob2holder).add(ob2);
}
}
}
}
尝试:
getObject1s.stream()
.filter(ob1s -> ob1s.hasChild != null)
.map(ob1s ->
{map.get(ob1holder).add(ob1s);
if (Objects.equals(ob1.getHolder, Boolean.TRUE))
{ map.get(ob11holder).add(ob1s.getID);}
return ob1s;})
.filter(ob1s -> ob1s.getObject2 != null)
.flatMap(ob1s -> ob1s.getObject2.getObjects.stream())
.map(ob2 -> map.get(ob2holder).add(ob2));
您的流中没有终端操作,因此不会执行流
getObject1s.stream()
.filter(ob1s -> ob1s.hasChild != null)
.forEach(ob1s ->{
map1.get(ob1holder).add(ob1s);
if(Boolean.TRUE.equal(ob1.getHolder)){ //null safe
map1.get(ob11holder).add(ob1s.getID);
}
if (ob1s.getObject2 != null){
ob1s.getObject2.getObjects.stream()
.forEach(ob2 -> map.get(ob2holder).add(ob2));
}
})
您的流中没有终端操作,因此不会执行流
getObject1s.stream()
.filter(ob1s -> ob1s.hasChild != null)
.forEach(ob1s ->{
map1.get(ob1holder).add(ob1s);
if(Boolean.TRUE.equal(ob1.getHolder)){ //null safe
map1.get(ob11holder).add(ob1s.getID);
}
if (ob1s.getObject2 != null){
ob1s.getObject2.getObjects.stream()
.forEach(ob2 -> map.get(ob2holder).add(ob2));
}
})
为什么您认为基于流的代码会更好?不一定更好,因为我计划为循环引入另一个嵌套的
for
循环,因此降低了代码中可见的循环复杂性。您在这里滥用了map
方法。map功能应为无状态且无干扰;您正在更改map1
@AndyTurner:遗憾的是,您的初始注释没有那么大帮助…因为流
必须有一个终端操作才能执行任何操作…理想状态是什么并不重要。您应该使用对象.equals(ob1.getHolder,Boolean.TRUE)
,除非您真的试图通过身份进行比较。为什么您认为基于流的代码会更好?不一定更好,因为我计划引入另一个嵌套的for
循环,因此可以降低代码中可见的循环复杂性。您在滥用map
方法。map功能应为无状态且无干扰;您正在更改map1
@AndyTurner:遗憾的是,您的初始注释没有那么大帮助…因为流
必须有一个终端操作才能执行任何操作…理想状态是什么并不重要。您应该使用对象.equals(ob1.getHolder,Boolean.TRUE)
,除非您确实试图通过标识进行比较。我是否可以将第二个条件中的for
转换为另一个流?哦,等等,nvm,让我回到你的问题上,我能不能将第二个条件中的for
转换成另一个流?哦,等等,nvm,让我给你回电话