我有以下情况
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中的列表。
由于
答案 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)
假设list
是List<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
不可否认,因为我从一个糟糕的问题中解决了许多假设。