如何使用流转换此代码

时间:2018-06-01 13:08:25

标签: java java-stream

我有以下课程:

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

有人可以帮助我将其转换成流吗?

3 个答案:

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