【问题标题】:How to recursively iterate over Lists of Lists in JAVA 8如何递归遍历 JAVA 8 中的列表列表
【发布时间】:2016-08-08 17:33:13
【问题描述】:

我有以下场景

 Object A has
 -- List<B>
 -- List<C> 
     -- Object A

对象 A 包含:List&lt;B&gt;List&lt;C&gt;

在遍历给定对象“A”后,我想在 List 中收集所有类型为“B”的对象。

注意: List&lt;C&gt; 可能包含对象“A”,因此迭代变为递归。

I/P: Object A  = {List<B>,List<C>}
O/P: List<B>//list of all objects of type B

在 JAVA 8 中迭代并将“B”类型的对象收集到列表的最佳方法是什么。

谢谢

【问题讨论】:

  • 我们是否假设listList&lt;List&lt;A&gt;&gt;B extends A
  • 您将不得不递归地遍历根列表中的所有项目,然后遍历那些列表类型的项目。每次迭代都会返回 List,您只需将一个与下一个组合起来。
  • 到目前为止你写过一些代码吗?
  • 显然 Java 标记让你投了很多反对票
  • 子列表可以有其他子列表吗?

标签: list recursion collections java-8


【解决方案1】:

我不明白为什么它必须单独使用 Stream 来完成?为什么不创建一个递归函数?而您的List&lt;A&gt; 肯定不包含另一个List&lt;A&gt;List&lt;B&gt;,您的对象A 可能包含这两个列表。

这是一个简单的递归方法,应该可以帮助您,但请记住,您并没有真正提供 A 和 B 的代码,所以我们无法真正知道:

    public List<B> getAllBs(List<A> aList) {
    return aList.stream()
                .map(a -> getAllBs(a))
                .collect(Collectors.toList());
}

private List<B> getAllBs(A someA) {
    List<B> returnList = new ArrayList<B>();
    returnList.addAll(someA.getListOfB());

    for(A otherA: someA.getListOfA()) {
        returnList.addAll(getAllBs(otherA);
    }

    return returnList;
}

【讨论】:

    【解决方案2】:

    假设listList&lt;List&lt;A&gt;&gt;B extends A,你的意思是任何子列表可以有任意数量的Bs,但你不想要As:

    List<A> allBs = list.stream() //Stream<List<A>>
                        .flatMap(l -> l.stream()) //Stream<A>
                        .filter(a -> a instanceof B) //Stream<A> containing only Bs
                        .collect(Collectors.toList()); //List<A> containing only Bs
    

    诚然未经测试,因为我从一个糟糕的问题中得出了许多假设。

    【讨论】:

      猜你喜欢
      • 2019-08-03
      • 2016-04-30
      • 2014-03-01
      • 1970-01-01
      • 2021-10-05
      • 2021-09-19
      • 2012-03-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多