Java Stream Map方法详解:从对象列表中高效提取字段
·
首先,我们来理解这段代码的目标
这段代码的目的是:从一个购物车项列表中,提取出所有商品的 ID,并组成一个新的列表。
我们可以把它拆解成两步:
- 有一个购物车项列表(
List<NewBeeMallShoppingCartItem>),每个购物车项(NewBeeMallShoppingCartItem)对象都包含了很多信息,比如商品ID、商品数量、加入时间等。 - 我们想要得到另一个列表(
List<Long>),这个列表里只包含这些购物车项对应的商品ID。
map 方法的核心作用:转换/映射
你可以把 map 方法想象成一个 “转换器”。
- 输入:一个流(Stream)里面包含着一系列元素(比如
A1, A2, A3...)。 - 操作:你提供一个“转换规则”函数。
map方法会把这个函数应用到流中的每一个元素上。 - 输出:一个新的流(Stream),里面包含的是转换后的结果(比如
B1, B2, B3...)。B1是由A1转换来的,B2是由A2转换来的,以此类推。
核心要点:map 是一对一的转换,输入一个元素,必定输出一个转换后的新元素。
结合你的代码逐行分析
我们再来仔细看你的代码(我修正了一个小笔误,NewBeeMal1ShoppingCartItem 应该是 NewBeeMallShoppingCartItem):
List<Long> newBeeMallGoodsIds = newBeeMallShoppingCartItems.stream() // 1. 获取流
.map(NewBeeMallShoppingCartItem::getGoodsId) // 2. 使用map进行转换
.collect(Collectors.toList()); // 3. 收集结果
第1步:newBeeMallShoppingCartItems.stream()
- 这就像是打开一个水龙头,把
List<NewBeeMallShoppingCartItem>这个“水桶”里的元素(一个个购物车项对象)变成一个可以逐个处理的“水流”(Stream)。
第2步:.map(NewBeeMallShoppingCartItem::getGoodsId) - 这是关键!
- 转换规则:
NewBeeMallShoppingCartItem::getGoodsId- 这是一个方法引用,它等同于 Lambda 表达式:
cartItem -> cartItem.getGoodsId() - 这个规则的意思是:“对于水流中的每一个
NewBeeMallShoppingCartItem对象,请调用它的getGoodsId()方法。”
- 这是一个方法引用,它等同于 Lambda 表达式:
- 转换过程:
- 假设你的购物车列表里有3个商品:
cartItem1(商品ID=1001)cartItem2(商品ID=1002)cartItem3(商品ID=1003)
map操作会依次进行:- 输入
cartItem1-> 应用规则getGoodsId()-> 输出Long类型的1001 - 输入
cartItem2-> 应用规则getGoodsId()-> 输出Long类型的1002 - 输入
cartItem3-> 应用规则getGoodsId()-> 输出Long类型的1003
- 输入
- 假设你的购物车列表里有3个商品:
- 此时,水流(Stream)的类型已经从
NewBeeMallShoppingCartItem对象流,变成了Long数字流(Stream<Long>)。
第3步:.collect(Collectors.toList())
- 这就像是拿一个新的“水桶”来接住处理过的“水流”。
- 它把
map转换后得到的Stream<Long>重新收集起来,组装成一个List<Long>列表。 - 最终,
newBeeMallGoodsIds这个变量里存放的就是[1001, 1002, 1003]。
一个简单的比喻
想象你在一个快递分拣工厂:
- 原始流水线(
stream()):传送带上是一个个快递包裹(NewBeeMallShoppingCartItem对象)。 map工人:他的工作不是筛选包裹,而是拆开每个包裹,只把里面的“订单号”(getGoodsId())纸条拿出来,然后把纸条放到新的传送带上。- 收集工序(
collect):新的传送带上全是“订单号”纸条,最后被打包成一个订单号列表(List<Long>)。


总结
map是 Stream API 中用于数据转换的核心方法。- 它不会改变流中元素的数量(一对一),但会改变元素的类型和内容。
- 在你的代码中,它完美地将一个对象列表 转换成了一个特定字段(商品ID)的列表,极大地简化了代码,无需手动遍历
for循环。
希望这个围绕你代码的讲解能让你彻底明白 map 的用法!
更多推荐


所有评论(0)