MST

星途 面试题库

面试题:Java Stream map方法在优化复杂业务逻辑中的应用

假设你有一个电商系统订单列表List<Order>,Order类包含订单编号orderId、订单项集合List<OrderItem>等属性,OrderItem类包含商品ID productId、商品数量quantity和商品价格price。现在要计算所有订单中每个商品的销售总额(商品ID - 销售总额),并按销售总额降序排列。请用Stream的map方法结合其他操作实现,要求代码尽量简洁且高效,同时说明这样实现的性能优势和可能存在的问题。
49.5万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试
import java.util.*;
import java.util.stream.Collectors;

class OrderItem {
    private long productId;
    private int quantity;
    private double price;

    public OrderItem(long productId, int quantity, double price) {
        this.productId = productId;
        this.quantity = quantity;
        this.price = price;
    }

    public long getProductId() {
        return productId;
    }

    public int getQuantity() {
        return quantity;
    }

    public double getPrice() {
        return price;
    }
}

class Order {
    private long orderId;
    private List<OrderItem> orderItems;

    public Order(long orderId, List<OrderItem> orderItems) {
        this.orderId = orderId;
        this.orderItems = orderItems;
    }

    public List<OrderItem> getOrderItems() {
        return orderItems;
    }
}

public class Main {
    public static void main(String[] args) {
        List<Order> orders = Arrays.asList(
                new Order(1L, Arrays.asList(new OrderItem(1L, 2, 10.0), new OrderItem(2L, 1, 20.0))),
                new Order(2L, Arrays.asList(new OrderItem(1L, 1, 10.0), new OrderItem(3L, 3, 15.0)))
        );

        Map<Long, Double> result = orders.stream()
               .flatMap(order -> order.getOrderItems().stream())
               .collect(Collectors.groupingBy(
                        OrderItem::getProductId,
                        Collectors.summingDouble(item -> item.getQuantity() * item.getPrice())
                ));

        List<Map.Entry<Long, Double>> sortedResult = result.entrySet().stream()
               .sorted(Map.Entry.comparingByValue(Comparator.reverseOrder()))
               .collect(Collectors.toList());

        sortedResult.forEach(entry -> System.out.println("Product ID: " + entry.getKey() + ", Total Sales: " + entry.getValue()));
    }
}

性能优势

  1. 简洁性:Stream API 使用链式调用,代码逻辑清晰,易于理解和维护。通过 flatMap 操作将多层嵌套的 List 展平,groupingBysummingDouble 操作简洁地完成了分组和求和,sorted 操作完成排序,代码紧凑。
  2. 并行处理:Stream API 支持并行流操作,在数据量较大时,可以充分利用多核 CPU 的优势,将任务并行处理,大大提高处理速度。例如,只需将 orders.stream() 改为 orders.parallelStream() 即可启用并行流。

可能存在的问题

  1. 内存开销:并行流在处理数据时,需要将数据分割成多个部分进行并行处理,这可能会增加内存开销。尤其是在数据量非常大时,可能会导致内存不足的问题。
  2. 调试困难:Stream API 的链式调用使得代码在调试时不太直观。一旦出现问题,很难确定具体是哪个操作步骤出现错误,需要对整个流处理过程有清晰的理解才能准确排查问题。
  3. 顺序依赖:如果数据之间存在顺序依赖关系,使用并行流可能会导致结果错误。因为并行流的执行顺序是不确定的,所以在使用并行流时需要确保操作是无状态且无序依赖的。