如何通过Streams在特定场景下获取List<List<D>>类型集合?
解决List转List<List>的问题
嗨,我懂你的需求了——你不是要把所有D元素合并成一个扁平列表,而是希望每个A实例对应的所有D元素各自组成一个独立的子列表,最终得到List<List<D>>类型的结果对吧?
你当前的代码之所以会得到单个List<D>,是因为连续的flatMap会把每一层集合都彻底扁平化:从A的B列表摊平,再摊平每个B的C列表,最后摊平每个C的D列表,所有D元素自然就被揉进同一个列表里了。
要实现你的目标,我们需要针对每个A单独处理其内部的D元素,先把每个A对应的所有D收集成一个List<D>,再把这些子列表汇总起来。具体代码调整如下:
List<List<D>> targetList = listA.stream() // 对每个A,收集它所有层级的D元素为一个List<D> .map(a -> a.getB().stream() .flatMap(b -> b.getC().stream()) .flatMap(c -> c.getD().stream()) .collect(Collectors.toList())) // 把所有A对应的List<D>收集成最终的List<List<D>> .collect(Collectors.toList());
代码细节说明:
- 外层使用
map操作:每个A对象都会被转换为一个包含其所有D元素的List<D> - 内层的连续
flatMap负责处理单个A内部的层级结构:把B列表→C列表→D列表逐层扁平化,最终收集为单个List<D> - 另外你原来的代码里
getB.stream()这类写法少了括号,正确的调用应该是getB().stream()(因为getter是方法,需要执行调用),上面的代码已经修正了这个细节
内容的提问来源于stack exchange,提问作者inis bali
相关产品推荐
相关产品推荐

