如何使用Stream流改写移除特定条件A元素的迭代器代码
没问题,我来帮你把这段迭代器逻辑转换成Stream流实现,先帮你明确下核心需求:移除listA内层列表中,所有B元素的C列表都为空的A对象,对吧?
先把你的类定义和原迭代器代码贴出来方便对照:
类定义
class A { List<B> b; // getters and setters } class B { List<C> c; // getters and setters } class C {}
原迭代器实现
Iterator<List<A>> iterator1 = listA.iterator(); while(iterator1.hasNext()) { Iterator<A> iterator2 = iterator1.next().iterator(); while(iterator2.hasNext()) { List<B> listB = iterator2.next().getB(); Iterator<B> iterator3 = listB.iterator(); int i=0; while(iterator3.hasNext()) { if(iterator3.next().getC().size() != 0) { continue; } else { i++; if(i == listB.size()) { iterator2.remove(); } } } } }
Stream流实现方案
我给你提供两种常用的实现方式,根据你的需求选择:
方案1:生成新的过滤后列表(无副作用,推荐)
这种方式不会修改原listA,而是生成一个全新的过滤后的列表,更符合Stream的设计理念:
import java.util.stream.Collectors; List<List<A>> filteredListA = listA.stream() // 遍历外层的每个List<A> .map(innerA -> innerA.stream() // 过滤掉:所有B的C列表都为空的A .filter(a -> a.getB().stream() // 只要有一个B的C列表不为空,就保留这个A .anyMatch(b -> !b.getC().isEmpty()) ) // 把过滤后的A收集成新的内层列表 .collect(Collectors.toList()) ) // 把所有内层列表收集成最终的外层列表 .collect(Collectors.toList());
方案2:直接修改原列表(原地操作)
如果需要直接修改原listA的内层列表,可以结合forEach和removeIf,逻辑和原迭代器完全一致:
listA.forEach(innerA -> // 直接移除内层列表中,所有B的C列表都为空的A innerA.removeIf(a -> a.getB().stream() .allMatch(b -> b.getC().isEmpty()) ) );
逻辑说明
原迭代器的核心逻辑是:统计某个A的B列表中,C为空的元素数量,如果数量等于B列表的长度(也就是所有B的C都为空),就移除这个A。
Stream实现中:
allMatch(b -> b.getC().isEmpty())等价于原逻辑的“所有B的C都为空”anyMatch(b -> !b.getC().isEmpty())是它的反向逻辑,用来保留符合条件的A
这样的Stream写法比嵌套迭代器简洁很多,可读性也更强。
内容的提问来源于stack exchange,提问作者Nana
相关产品推荐
相关产品推荐

