【发布时间】:2019-10-03 20:06:12
【问题描述】:
我正在尝试重新创建一个进程来创建一个对象列表,这些对象列表是使用 Java 8 流的另一个对象列表的聚合。
例如,我有一个类,如下所述,它是通过数据库调用或类似方法提供的
public class Order {
private String orderNumber;
private String customerNumber;
private String customerGroup;
private Date deliveryDate;
private double orderValue;
private double orderQty;
}
在我的应用程序的其他地方,我有一个 OrderTotal 类,它表示和聚合按客户编号和组进行的订单分组,并对 orderValue 和 orderQty 的总数求和。 (在 customerGroup 和 customerNumber 上使用 equals 和 hashcode)
public class OrderTotal {
private String customerGroup;
private String customerNumber;
private double totalValue;
private double totalQty;
}
我们在 java 8 之前实现这一点的“长手”方式如下
public Collection<OrderTotal> getTotals(List<Order> orders) {
///map created for quick access to the order total for each order
Map<OrderTotal, OrderTotal> map = new HashMap<>();
///loop through all orders adding to the relevaent order total per iteration
for (Order order : orders) {
OrderTotal orderTotal = createFromOrder(order);
{
///if the order total already exists in the map use that one, otherwise add it to the map.
OrderTotal temp = map.get(orderTotal);
if(temp == null){
map.put(orderTotal, orderTotal);
}else{
orderTotal = temp;
}
}
///add the values to the total
aggregate(orderTotal, order);
}
return map.values();
}
private OrderTotal createFromOrder(Order order) {
OrderTotal orderTotal = new OrderTotal();
orderTotal.setCustomerGroup(order.getCustomerGroup());
orderTotal.setCustomerNumber(order.getCustomerNumber());
return orderTotal;
}
private void aggregate(OrderTotal orderTotal, Order order){
orderTotal.setTotalQty(orderTotal.getTotalQty() + order.getOrderQty());
orderTotal.setTotalValue(orderTotal.getTotalValue() + order.getOrderValue());
}
我一直在研究使用分组依据和归约函数的收集器,但它们似乎都专注于聚合订单类,而不是在 OrderTotal 类中组合总计。
我正在寻找一个整洁的流或收集功能,以消除此代码中的所有臃肿。
【问题讨论】:
-
您正在寻找的是来自 Orders 的总和
totalValue和totalQty并将它们放入OrderTotal- 这对于两个流来说相当简单 -
这可能非常适合Code Review,但请务必在发布之前先阅读他们的help center,以确保它符合主题
标签: java java-8 java-stream aggregation composition