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()));
}
}
性能优势
- 简洁性:Stream API 使用链式调用,代码逻辑清晰,易于理解和维护。通过
flatMap
操作将多层嵌套的 List
展平,groupingBy
和 summingDouble
操作简洁地完成了分组和求和,sorted
操作完成排序,代码紧凑。
- 并行处理:Stream API 支持并行流操作,在数据量较大时,可以充分利用多核 CPU 的优势,将任务并行处理,大大提高处理速度。例如,只需将
orders.stream()
改为 orders.parallelStream()
即可启用并行流。
可能存在的问题
- 内存开销:并行流在处理数据时,需要将数据分割成多个部分进行并行处理,这可能会增加内存开销。尤其是在数据量非常大时,可能会导致内存不足的问题。
- 调试困难:Stream API 的链式调用使得代码在调试时不太直观。一旦出现问题,很难确定具体是哪个操作步骤出现错误,需要对整个流处理过程有清晰的理解才能准确排查问题。
- 顺序依赖:如果数据之间存在顺序依赖关系,使用并行流可能会导致结果错误。因为并行流的执行顺序是不确定的,所以在使用并行流时需要确保操作是无状态且无序依赖的。