MST

星途 面试题库

面试题:Java流式API与集合框架整合在复杂业务场景中的设计与应用

假设现在有一个复杂的电商业务场景,存在多个集合,如订单集合(Order)、商品集合(Product)、用户集合(User)。订单包含商品信息及购买用户信息,商品有价格、库存等属性,用户有等级等属性。要求实现一个功能:统计不同用户等级下,购买金额超过1000元的订单中,库存小于10的商品数量总和。请详细设计并给出基于Java流式API与集合框架整合的完整代码实现,同时分析该设计的优缺点及可扩展性。
44.0万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试

代码实现

import java.util.*;
import java.util.stream.Collectors;

class Order {
    private User user;
    private List<Product> products;
    private double totalAmount;

    public Order(User user, List<Product> products, double totalAmount) {
        this.user = user;
        this.products = products;
        this.totalAmount = totalAmount;
    }

    public User getUser() {
        return user;
    }

    public List<Product> getProducts() {
        return products;
    }

    public double getTotalAmount() {
        return totalAmount;
    }
}

class Product {
    private String name;
    private double price;
    private int stock;

    public Product(String name, double price, int stock) {
        this.name = name;
        this.price = price;
        this.stock = stock;
    }

    public int getStock() {
        return stock;
    }
}

class User {
    private String level;

    public User(String level) {
        this.level = level;
    }

    public String getLevel() {
        return level;
    }
}

public class EcommerceStatistics {
    public static void main(String[] args) {
        List<Order> orders = Arrays.asList(
                new Order(new User("A"), Arrays.asList(new Product("P1", 500, 5), new Product("P2", 600, 15)), 1100),
                new Order(new User("B"), Arrays.asList(new Product("P3", 800, 8), new Product("P4", 300, 12)), 1100)
        );

        Map<String, Integer> result = orders.stream()
               .filter(order -> order.getTotalAmount() > 1000)
               .flatMap(order -> order.getProducts().stream()
                       .filter(product -> product.getStock() < 10)
                       .map(product -> new AbstractMap.SimpleEntry<>(order.getUser().getLevel(), 1)))
               .collect(Collectors.groupingBy(
                        AbstractMap.SimpleEntry::getKey,
                        Collectors.summingInt(AbstractMap.SimpleEntry::getValue)
                ));

        result.forEach((level, count) -> System.out.println("User Level: " + level + ", Product Count: " + count));
    }
}

优点

  1. 代码简洁:使用Java流式API,代码逻辑紧凑,通过链式调用的方式完成复杂的统计操作,提高了代码的可读性。
  2. 易于理解:将数据处理流程以一种声明式的方式表达出来,从过滤订单到处理商品,再到分组统计,逻辑清晰。
  3. 并行处理:流式API支持并行流,可以充分利用多核CPU的优势,提高大数据量下的处理效率。

缺点

  1. 调试困难:链式调用使得代码在调试时不够直观,一旦出现问题,难以定位具体出错的位置。
  2. 性能开销:在数据量较小的情况下,流式API的性能开销可能会高于传统的迭代方式,因为它需要创建中间流和相关的计算资源。

可扩展性

  1. 数据结构扩展:如果需要增加新的集合或属性,只需要在相应的类中添加字段和访问方法,在统计逻辑中适当增加过滤或映射操作即可。例如,如果增加订单时间属性,要统计特定时间段内的订单,可以在Order类中添加时间字段,并在orders.stream()之后增加时间过滤条件。
  2. 统计逻辑扩展:如果需要增加新的统计条件,如统计购买数量超过一定值的情况,只需在流操作中增加相应的过滤条件即可,无需大幅修改整体代码结构。