首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用streams转换此代码

如何使用streams转换此代码
EN

Stack Overflow用户
提问于 2018-06-01 21:08:25
回答 3查看 75关注 0票数 2

我有以下几个类:

代码语言:javascript
运行
复制
Class A {
List<B> b
 //getters and setters
   }
  CLass B {
   List<C> c
 //getters and setters
}
  Class C {}

现在我有一个列表:

代码语言:javascript
运行
复制
List<List<A>> listA;

我想要做的是,如果List<B>的每个元素都有一个空的List<C>,则从listA的内部列表中删除一个类型为A的元素。我已经使用迭代器做到了这一点,但现在我必须使用streams来完成。以下代码使用迭代器工作:

代码语言:javascript
运行
复制
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();
                      }
                  }
              }
          }
      }

有人能帮我把这个转换成流吗??

EN

回答 3

Stack Overflow用户

发布于 2018-06-01 21:31:20

您可以处理内部列表上的流,然后根据其b字段中的数据过滤A元素:

代码语言:javascript
运行
复制
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());

要从相同的列表实例中删除,只需在主列表上运行基于索引的迭代,然后显式地从内部列表中删除符合条件的项:

代码语言:javascript
运行
复制
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> ),以便从主列表中的相应条目中删除。

票数 0
EN

Stack Overflow用户

发布于 2018-06-01 22:32:19

不是的。您不应该尝试使用stream来“移除”。Stream被设计成无状态的,并且变量应该是不可变的。

票数 0
EN

Stack Overflow用户

发布于 2018-06-02 22:28:34

如果

的每个元素都有一个空列表,那么我想做的就是从listA的内部列表中删除一个类型为A的元素。我已经使用迭代器做到了这一点,但现在我必须使用streams来完成

您可以使用单个filter()管道轻松实现这一点:

代码语言:javascript
运行
复制
List<A> cleanedList = listA.stream()
        .filter(a -> a.getListB().stream().map(B::getListC).noneMatch(List::isEmpty))
        .collect(Collectors.toList());
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50644173

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档