Java 如何使用流转换此代码
我有以下课程:Java 如何使用流转换此代码,java,java-stream,Java,Java Stream,我有以下课程: Class A { List<B> b //getters and setters } CLass B { List<C> c //getters and setters } Class C {} A类{ 名单b //接球手和接球手 } B类{ 清单c //接球手和接球手 } 类C{} 现在我有一个清单: List<List<A>> listA; 列表列表a; 如果List的每个元素都有一个空的Lis
Class A {
List<B> b
//getters and setters
}
CLass B {
List<C> c
//getters and setters
}
Class C {}
A类{
名单b
//接球手和接球手
}
B类{
清单c
//接球手和接球手
}
类C{}
现在我有一个清单:
List<List<A>> listA;
列表列表a;
如果List
的每个元素都有一个空的List
,我想做的是从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();
}
}
}
}
}
Iterator iterator1=listA.Iterator();
while(iterator1.hasNext()){
迭代器迭代器2=迭代器1.next().Iterator();
while(iterator2.hasNext()){
List listB=iterator2.next().getB();
迭代器迭代器3=listB.Iterator();
int i=0;
while(iterator3.hasNext()){
if(iterator3.next().getC().size()!=0){
继续;
}
否则{
i++;
如果(i==list.size()){
迭代器2.remove();
}
}
}
}
}
有人能帮我把它转换成流吗?你可以处理内部列表中的流,然后根据
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());
最后一段代码只是编译一个列表
(在树中以某种方式包含一个空的列表
),以便从主列表中的相应条目中删除。否。您不应该尝试使用流“删除”。流被设计成无状态的,并且变量应该是不可变的。流可用于遍历列表,并收集要保留到新列表中的值
我想做的是,如果List的每个元素都有一个空列表,那么从listA的内部列表中删除一个类型为A的元素。我已经使用迭代器完成了这项工作,但现在我必须使用流
通过一个过滤器()
管道,您可以很容易地实现这一点:
List<A> cleanedList = listA.stream()
.filter(a -> a.getListB().stream().map(B::getListC).noneMatch(List::isEmpty))
.collect(Collectors.toList());
List cleanedList=listA.stream()
.filter(a->a.getListB().stream().map(B::getListC).noneMatch(List::isEmpty))
.collect(Collectors.toList());
到目前为止做了哪些努力?你被困在哪里了?嗨,欧内斯特,有没有解决办法只从列表中删除这些元素而不返回经过过滤的列表?请不要使用parallelStream
,除非你知道你正在处理非常大的数据data@Lino谢谢你的观察。但是“可怕的大”并没有给出一个明确的指示(即使它给出了一个想法),你能给出一个更精确的指导吗?欧内斯特,谢谢你的回答。我想一定是allMatch而不是anyMatch@Nana我认为您是对的,因为如果getC().size()==0
在任何地方都为false,您将跳过迭代。
List<A> cleanedList = listA.stream()
.filter(a -> a.getListB().stream().map(B::getListC).noneMatch(List::isEmpty))
.collect(Collectors.toList());