原始代码
/**
* 再来一单
*
* @param id
*/
public void repetition(Long id) {
// 查询当前用户id
Long userId = BaseContext.getCurrentId();
// 根据订单id查询当前订单详情
List<OrderDetail> orderDetailList = orderDetailMapper.getByOrderId(id);
// 将订单详情对象转换为购物车对象
List<ShoppingCart> shoppingCartList = orderDetailList.stream().map(x -> {
ShoppingCart shoppingCart = new ShoppingCart();
// 将原订单详情里面的菜品信息重新复制到购物车对象中
BeanUtils.copyProperties(x, shoppingCart, "id");
shoppingCart.setUserId(userId);
shoppingCart.setCreateTime(LocalDateTime.now());
return shoppingCart;
}).collect(Collectors.toList());
// 将购物车对象批量添加到数据库
shoppingCartMapper.insertBatch(shoppingCartList);
}
1️⃣ orderDetailList.stream()
orderDetailList是一个List<OrderDetail>。- 调用
.stream()表示把这个列表转换成一个 Stream(流),流是 Java 8 中的一个抽象,可以用来对集合进行链式、函数式操作。
2️⃣ .map(x -> {})
-
map是流的中间操作之一:-
作用是把流中的每个元素
x映射(transform)成另一个对象。 -
在这里
x是OrderDetail类型。 -
x -> {}是 Lambda 表达式:x是输入参数,即流中的每个元素;{}里的内容是你对这个元素的处理,比如把OrderDetail转成ShoppingCart。
-
返回的会是一个新的 Stream,元素类型是
map返回的对象类型。
-
例如:
.map(x -> x.getId())
- 把
OrderDetail转成它的 ID(假设是 Long),此时映射后得到的是Stream<Long>。
你代码里实际做的是:
.map(x -> {
ShoppingCart shoppingCart = new ShoppingCart();
BeanUtils.copyProperties(x, shoppingCart, "id");
shoppingCart.setUserId(userId);
shoppingCart.setCreateTime(LocalDateTime.now());
return shoppingCart;
})
- 每个
OrderDetail被映射成一个ShoppingCart。
1️⃣ orderDetailList.stream()
orderDetailList是一个List<OrderDetail>。- 调用
.stream()表示把这个列表转换成一个 Stream(流),流是 Java 8 中的一个抽象,可以用来对集合进行链式、函数式操作。
2️⃣ .map(x -> {})
-
map是流的中间操作之一:-
作用是把流中的每个元素
x映射(transform)成另一个对象。 -
在这里
x是OrderDetail类型。 -
x -> {}是 Lambda 表达式:x是输入参数,即流中的每个元素;{}里的内容是你对这个元素的处理,比如把OrderDetail转成ShoppingCart。
-
返回的会是一个新的 Stream,元素类型是
map返回的对象类型。
-
例如:
java
复制编辑
.map(x -> x.getId())
- 把
OrderDetail转成它的 ID(假设是 Long),此时映射后得到的是Stream<Long>。
你代码里实际做的是:
java
复制编辑
.map(x -> {
ShoppingCart shoppingCart = new ShoppingCart();
BeanUtils.copyProperties(x, shoppingCart, "id");
shoppingCart.setUserId(userId);
shoppingCart.setCreateTime(LocalDateTime.now());
return shoppingCart;
})
- 每个
OrderDetail被映射成一个ShoppingCart。
3️⃣ .collect(Collectors.toList())
collect是流的终止操作,表示要把流里的数据收集到一个集合中。Collectors.toList()表示把处理后的流结果收集到一个新的List。
🔎 组合起来理解
你要处理一个 List<OrderDetail>,想把它转换成 List<ShoppingCart>,思路是:
- stream() :把列表变成流 →
- map() :把每个
OrderDetail→ 转换 →ShoppingCart→ - collect(Collectors.toList()) :把转换后的流 → 收集 → 新的
List<ShoppingCart>。 - 使用
BeanUtils.copyProperties()将OrderDetail中属性复制到ShoppingCart,但排除了"id"(因为购物车表主键应是新的,不可沿用原订单详情的 ID);
✅ 等价的传统写法
用 Java 8 之前的写法你可能会这样写:
java
复制编辑
List<ShoppingCart> shoppingCartList = new ArrayList<>();
for (OrderDetail x : orderDetailList) {
ShoppingCart shoppingCart = new ShoppingCart();
BeanUtils.copyProperties(x, shoppingCart, "id");
shoppingCart.setUserId(userId);
shoppingCart.setCreateTime(LocalDateTime.now());
shoppingCartList.add(shoppingCart);
}
但 Java 8 的流式写法更简洁,也避免了很多样板代码(比如 new List、循环、add)。
📌 小结
这一句 orderDetailList.stream().map(...).collect(Collectors.toList()) 表示:
把
orderDetailList里的每个元素,按你在map里定义的逻辑进行转换,最后把所有转换结果收集成一个新的列表。
3️⃣ .collect(Collectors.toList())
collect是流的终止操作,表示要把流里的数据收集到一个集合中。Collectors.toList()表示把处理后的流结果收集到一个新的List。
🔎 组合起来理解
你要处理一个 List<OrderDetail>,想把它转换成 List<ShoppingCart>,思路是:
- stream() :把列表变成流 →
- map() :把每个
OrderDetail→ 转换 →ShoppingCart→ - collect(Collectors.toList()) :把转换后的流 → 收集 → 新的
List<ShoppingCart>。
✅ 等价的传统写法
用 Java 8 之前的写法你可能会这样写:
List<ShoppingCart> shoppingCartList = new ArrayList<>();
for (OrderDetail x : orderDetailList) {
ShoppingCart shoppingCart = new ShoppingCart();
BeanUtils.copyProperties(x, shoppingCart, "id");
shoppingCart.setUserId(userId);
shoppingCart.setCreateTime(LocalDateTime.now());
shoppingCartList.add(shoppingCart);
}
但 Java 8 的流式写法更简洁,也避免了很多样板代码(比如 new List、循环、add)。
📌 小结
这一句 orderDetailList.stream().map(...).collect(Collectors.toList()) 表示:
把
orderDetailList里的每个元素,按你在map里定义的逻辑进行转换,最后把所有转换结果收集成一个新的列表。