代码实现
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));
}
}
优点
- 代码简洁:使用Java流式API,代码逻辑紧凑,通过链式调用的方式完成复杂的统计操作,提高了代码的可读性。
- 易于理解:将数据处理流程以一种声明式的方式表达出来,从过滤订单到处理商品,再到分组统计,逻辑清晰。
- 并行处理:流式API支持并行流,可以充分利用多核CPU的优势,提高大数据量下的处理效率。
缺点
- 调试困难:链式调用使得代码在调试时不够直观,一旦出现问题,难以定位具体出错的位置。
- 性能开销:在数据量较小的情况下,流式API的性能开销可能会高于传统的迭代方式,因为它需要创建中间流和相关的计算资源。
可扩展性
- 数据结构扩展:如果需要增加新的集合或属性,只需要在相应的类中添加字段和访问方法,在统计逻辑中适当增加过滤或映射操作即可。例如,如果增加订单时间属性,要统计特定时间段内的订单,可以在
Order
类中添加时间字段,并在orders.stream()
之后增加时间过滤条件。
- 统计逻辑扩展:如果需要增加新的统计条件,如统计购买数量超过一定值的情况,只需在流操作中增加相应的过滤条件即可,无需大幅修改整体代码结构。