如何递归迭代JAVA 8中的列表列表

时间:2016-08-08 17:33:14

标签: list recursion collections java-8

我有以下情况

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

对象A包含:List<B>List<C>

我想收集所有类型的物品&#39; B&#39;在遍历给定对象后的列表中&#39; A&#39;。

注意: List<C>可能包含对象&#39; A&#39;,因此迭代变为递归。

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

迭代这个并收集&#39; B&#39;类型的对象的最佳方法是什么?到JAVA 8中的列表。

由于

2 个答案:

答案 0 :(得分:1)

我不明白为什么必须用Stream完成它?你为什么不创建一个递归函数?而且您的List<A>肯定不包含其他List<A>List<B>,您的对象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;
}

答案 1 :(得分:0)

假设listList<List<A>>B extends A,并且您的意思是任何子列表都可以有B个,但您不能想要A s:

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

不可否认,因为我从一个糟糕的问题中解决了许多假设。