自学内容网 自学内容网

【JAVA进阶篇教学】第二十篇:如何高效处理List集合数据及明细数据

博主打算从0-1讲解下java进阶篇教学,今天教学第二十篇:如何高效处理List集合数据及明细数据。

Java 8 Stream API 助力高效处理集合数据(订单明细查询优化案例)

目录

一、前言 

二、问题回顾

三、优化思路与 Stream API 的运用

四、总结


一、前言 

目前采用的是jdk8中stream流来处理,以及一些效率高的方法来处理集合及明细数据。

二、问题回顾

我们有一个 List<Order> 类型的集合,其中 Order 类包含 orderId 字段,同时存在对应的订单明细表,由 OrderDetail 类表示明细信息。
常规的做法往往是这样去获取每个订单的明细数据:

List<Order> orderList = getOrderListFromSomewhere(); // 假设从某个地方获取到订单列表
for (Order order : orderList) {
    String orderId = order.getOrderId();
    OrderDetail detail = findOrderDetailByOrderId(orderId); // 每次循环都依据订单ID去数据库查询明细,频繁操作数据库
    // 后续对detail进行相应处理,比如关联到订单对象等
}

这种方式随着订单数量增多,频繁的数据库连接和查询操作会严重影响性能,所以我们需要进行优化。 

三、优化思路与 Stream API 的运用

利用 Java 8 的 Stream API,我们可以按如下优化思路进行操作:

  • 首先,从 List<Order> 集合中通过 Stream 的 map 操作提取出所有的 orderId,并收集为一个 List<String>。
  • 接着,使用提取出的 orderId 集合,一次性去数据库查询出所有对应的订单明细数据,避免多次单个查询。
  • 最后,把查询到的订单明细数据通过 Stream 的 collect 方法转变成以 orderId 为键,OrderDetail 对象为值的 Map<String, OrderDetail>,方便后续依据订单 orderId 快速获取对应明细。

以下是具体的代码实现,同样假设 Order 和 OrderDetail 类具有如下简单结构(实际项目中可根据真实业务需求扩展相应属性和方法):

class Order {
    private String orderId;
    // 其他订单相关字段及对应的getter、setter方法

    public String getOrderId() {
        return orderId;
    }
}

class OrderDetail {
    private String orderId;
    // 明细相关的各种字段及对应的getter、setter方法

    public String getOrderId() {
        return orderId;
    }
}

下面是运用 Stream API 优化后的完整代码:

import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

public class OrderDataProcessingWithStream {

    public static void main(String[] args) {
        // 模拟获取订单列表
        List<Order> orderList = getOrderListFromSomewhere();
        // 提取orderId集合
        List<String> orderIdList = orderList.stream()
               .map(Order::getOrderId)
               .collect(Collectors.toList());
        // 一次性查询出所有订单明细数据
        List<OrderDetail> orderDetailList = findAllOrderDetails(orderIdList);
        // 将明细数据转成Map方便后续查找
        Map<String, OrderDetail> orderDetailMap = orderDetailList.stream()
               .collect(Collectors.toMap(OrderDetail::getOrderId, detail -> detail));

        // 现在可以方便地根据订单ID获取对应的明细数据了
        orderList.forEach(order -> {
            String orderId = order.getOrderId();
            OrderDetail detail = orderDetailMap.get(orderId);
            // 在这里可以进行后续的业务处理,比如将明细数据设置到订单对象等
            order.setOrderDetail(detail);
        });
    }

    // 模拟从某个地方获取订单列表,这里简单返回一个示例列表
    private static List<Order> getOrderListFromSomewhere() {
        // 创建示例订单列表,实际中可能从数据库、缓存等地方获取
        return List.of(
                new Order() {{
                    setOrderId("001");
                }},
                new Order() {{
                    setOrderId("002");
                }}
        );
    }

    // 模拟根据订单ID列表一次性查询出所有订单明细数据(实际中这里会涉及数据库操作)
    private static List<OrderDetail> findAllOrderDetails(List<String> orderIdList) {
        // 假设根据每个orderId去数据库查询并构建对应的OrderDetail对象添加到列表中
        return orderIdList.stream().map(orderId -> {
            OrderDetail detail = new OrderDetail();
            detail.setOrderId(orderId);
            // 模拟设置其他明细数据
            return detail;
        }).collect(Collectors.toList());
    }
}

在上述代码中:

  • 提取 orderId 集合部分:

通过 orderList.stream() 将订单列表转换为流,然后使用 map(Order::getOrderId) 操作,从每个 Order 对象中提取 orderId,最后通过 collect(Collectors.toList()) 将提取出来的 orderId 收集成一个 List<String>。这一步充分利用了 Stream API 简洁且函数式的风格来实现数据转换。

  • 将明细数据转成 Map 部分:

针对查询到的 orderDetailList,再次使用流操作 orderDetailList.stream(),接着通过 collect(Collectors.toMap(OrderDetail::getOrderId, detail -> detail)) 把明细列表转变成以 orderId 为键、OrderDetail 对象为值的 Map。这里 Collectors.toMap 方法的第一个参数指定了作为键的属性提取方式(即通过 OrderDetail::getOrderId 获取 orderId),第二个参数就是简单地返回明细对象本身,表示值的映射方式。

通过这样运用 Stream API 的优化方式,代码更加简洁易读,同时有效减少了数据库操作次数,尤其在处理大量订单数据时,能够显著提升程序性能,让数据处理变得更加高效和优雅。

四、总结

如果按照普通的思路做for循环去查找明细信息,假如List<Order>list 中有20条数据,那么你for循环部分就需要访问数据库20次,大大增加了io消耗,如果有更复杂的处理,那么程序就会很慢。

优化后,你只需要访问一次数据库,一次性查出所有数据,然后再内存中操作即可。

点个关注,不会迷路!


原文地址:https://blog.csdn.net/qq_23126581/article/details/144088674

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!