Я пытаюсь воссоздать процесс для создания списка объектов, которые являются агрегацией другого списка объектов, используя потоки 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)
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.
Я ищу аккуратный поток или функцию сбора, которая удаляет все помехииз этого кода.