我有以下课程:
Class A {
List<B> b
//getters and setters
}
CLass B {
List<C> c
//getters and setters
}
Class C {}
现在我有一个清单:
List<List<A>> listA;
我想要做的是,如果List<B>
的每个元素都有一个空List<C>
,则从listA的内部列表中删除A类型的元素。我使用迭代器完成了这个,但现在我必须使用流来完成它。以下代码使用迭代器:
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 == list.size()) {
iterator2.remove();
}
}
}
}
}
有人可以帮助我将其转换成流吗?
答案 0 :(得分:0)
您可以在内部列表上处理流,然后根据A
字段中的数据过滤b
个元素:
List<List<A>> selected =
listA.parallelStream()
.map(aList -> aList.stream()
.filter(a -> a.getB()
.stream()
.anyMatch(b -> !b.getC().isEmpty()))
.collect(Collectors.toList()))
.collect(Collectors.toList());
要从相同的列表实例中删除,您只需在主列表上运行基于索引的迭代,然后从内部列表中显式删除符合条件的项目:
IntStream.range(0, listA.size())
.forEach(
i -> listA.get(i)
.removeAll(
listA.get(i)
.stream()
.filter(a -> a.getB().stream().allMatch(b -> b.getC().size() == 0))
.collect(Collectors.toList())) );
最后一个片段只是编译List<A>
(在树中以某种方式包含空List<C>
),以便从主列表中的相应条目中删除。
答案 1 :(得分:0)
没有。你不应该尝试用流“删除”。 Stream被设计为无状态,变量应该是不可变的。 Stream可用于浏览您的列表,并将您要保留的值收集到新列表中。
答案 2 :(得分:0)
我想要做的是,如果List的每个元素都有一个空List,则从listA的内部列表中删除A类型的元素。我使用迭代器完成了这个,但现在我必须使用流
使用单个filter()
管道,您可以轻松实现这一目标:
List<A> cleanedList = listA.stream()
.filter(a -> a.getListB().stream().map(B::getListC).noneMatch(List::isEmpty))
.collect(Collectors.toList());