我有以下几个类:
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的元素。我已经使用迭代器做到了这一点,但现在我必须使用streams来完成。以下代码使用迭代器工作:
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();
}
}
}
}
}有人能帮我把这个转换成流吗??
发布于 2018-06-01 21:31:20
您可以处理内部列表上的流,然后根据其b字段中的数据过滤A元素:
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> ),以便从主列表中的相应条目中删除。
发布于 2018-06-01 22:32:19
不是的。您不应该尝试使用stream来“移除”。Stream被设计成无状态的,并且变量应该是不可变的。
发布于 2018-06-02 22:28:34
如果
的每个元素都有一个空列表,那么我想做的就是从listA的内部列表中删除一个类型为A的元素。我已经使用迭代器做到了这一点,但现在我必须使用streams来完成
您可以使用单个filter()管道轻松实现这一点:
List<A> cleanedList = listA.stream()
.filter(a -> a.getListB().stream().map(B::getListC).noneMatch(List::isEmpty))
.collect(Collectors.toList());https://stackoverflow.com/questions/50644173
复制相似问题