首页 > 解决方案 > 可以使用流 api 重写以下循环,还是我徒劳无功?

问题描述

主要对象:

public class Order {
    private Long orderId;
    ...
    private List<OrderAudit> auditList;
}

Order的Item对象

public class OrderAudit {
    private Long orderId;
    ...
}

所有订单

List<Order> orderList = orderDao.getOrderList(request);

所有项目

List<OrderAudit> allAudits = orderDao.getAllAudits();

在那里我尝试查找每个订单的所有审核并将此列表设置为订单。循环:

for (Order order : orderList) {
    Long orderId = order.getOrderId();

    List<OrderAudit> orderAuditList = allAudits.stream()
                                               .filter(x-> x.getOrderId().equals(orderId))
                                               .collect(Collectors.toList());
    order.setAuditList(orderAuditList);
}

标签: javajava-stream

解决方案


您可以使用以下方式groupingBy创建地图List<OrderAudit>orderId

Map<Long, List<OrderAudit>> orderAuditMap = allAudits.stream()
            .collect(Collectors.groupingBy(OrderAudit::getOrderId));

如果你想保持顺序OrderAudit

Map<Long, List<OrderAudit>> orderAuditMap = allAudits.stream()
                .collect(Collectors.groupingBy(i -> i.getOrderId(), LinkedHashMap::new, Collectors.toList()));

然后从地图List<OrderAudit>中获取orderId并按顺序使用forEach()

orderList.stream().forEach(e -> e.setAuditList(orderAuditMap.get(e.getOrderId())));

推荐阅读