Java 8 Lambda Stream如何提取订单列表中所有商品ID?
解决Java Stream获取所有订单商品ID列表的问题
嘿,这个问题我太熟悉了!你当前的写法用了普通的map操作,它会把每个订单对应的商品ID列表单独转成一个List<Integer>,最后得到的是List<List<Integer>>——也就是嵌套的二维列表,这显然不是你想要的所有商品ID的扁平列表。
正确实现方式:使用flatMap替代map
flatMap的作用就是把多个流“扁平化”合并成一个单一的流,刚好能解决这个嵌套列表的问题。具体代码如下:
import java.util.List; import java.util.stream.Collectors; // 假设你的Order和Goods类已经正确定义 List<Integer> allGoodsIds = list.stream() // 把每个订单的goodsList转换成商品流,然后合并成一个全局商品流 .flatMap(order -> order.getGoodsList().stream()) // 从每个商品中提取ID .map(goods -> goods.getId()) // 收集成最终的ID列表 .collect(Collectors.toList());
为什么原来的写法不对?
- 普通
map是一对一的转换:每个订单对象对应一个List<Integer>(该订单的商品ID列表),所以最终结果是嵌套的列表。 flatMap是一对多+扁平化:它先把每个订单转换成对应的商品流,再把所有这些小流合并成一个包含所有商品的大流,后续的map和收集操作都是在这个大流上进行,自然就能得到扁平的ID列表了。
内容的提问来源于stack exchange,提问作者ejiyuan
相关产品推荐
相关产品推荐

