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());