orderDetailList.stream().map(x -> {}).collect(Collectors.toList());讲解

95 阅读3分钟

原始代码

    /**
     * 再来一单
     *
     * @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)成另一个对象。

    • 在这里 xOrderDetail 类型。

    • 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)成另一个对象。

    • 在这里 xOrderDetail 类型。

    • 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 里定义的逻辑进行转换,最后把所有转换结果收集成一个新的列表。