对象列表中属性值的总和

Sum of attribute value in Object List

我有一个订单,其中包含订单商品列表 。至于订单项目。

public class OrderItem {
  private long itemId;
  private String itemName;
  private String ownerName;
  private double value;

  // all the related constructors, mutators and accessors are included.
}

如果在这个列表中我有以下项目

OrderItem(1,"item1","John",12.00);
OrderItem(2,"item2","John",385.00);
OrderItem(3,"item3","John",20.00);
OrderItem(4,"item4","Doe",19.00);

我想计算订单所有者姓名相同的价值总和。

例如如果所有者姓名为“John”,则 return 417.00,如果姓名为“Doe”,则为 19.00.

如何通过 Java 流执行此操作?非常感谢

对于这个问题,您可以简单地使用 for each 循环来迭代列表,如果 ownerName 与您要查找的名称匹配,则将其添加到您的总和中。

double sum = 0;
for (OrderItem item: yourListName){
    if (item.getOwnerName().equals(nameYoureSearchingFor))
        sum+=item.value;
}

如果要使用迭代器,可以使用:

OrderItem item;
        double sum = 0;
        Iterator<OrderItem> iterator = list.stream().iterator();
        while(iterator.hasNext()){
            item = iterator.next();
            if (item.getOwnerName().equals(nameYoureLookingFor))
                sum+= item.getValue();
        }

你可以这样做

  Double sum = list.stream()
            .filter(orderItem -> orderItem.getItemName().equals("john"))
            .mapToDouble(OrderItem::getValue)
            .sum();

假设你有一个 OrderItems 的列表,我们可以按 ownerName 对它们进行分组,然后作为下游收集器进行求和:

List<OrderItem> items = List.of(
              new OrderItem(1,"item1","John",12.00);
              new OrderItem(2,"item2","John",385.00);
              new OrderItem(3,"item3","John",20.00);
              new OrderItem(4,"item4","Doe",19.00));

Map<String, Double> result = items.stream()
        .collect(Collectors.groupingBy(OrderItem::ownerName,
                 Collectors.summingDouble(OrderItem::value)));

result 映射中,我们可以通过所有者名称获取每个值:

System.out.println(result.get("John")); //prints 417.00