使用Java Stream API汇总嵌套列表

时间:2019-06-25 15:06:16

标签: java java-8 java-stream

我有以下Java POJO:

public class Order {
    private List<OrderLine> orderLines;
    private String name;
    // ... lots of other fields

    // Getters & setters & ctors down here
}

public class OrderLine {
    private String productId;
    private Integer quantity;

    // Getters & setters & ctors down here
}

我试图找到一种Java 8“流式”方式来获取订单中所有订单行的总数。捕获此计数的“旧”方法如下所示:

int totalQuantity = 0;
for (OrderLine ol : order.getOrderLines()) {
    totalQuantity += ol.getQuantity();  
}

到目前为止我最大的尝试:

Integer totalQuantity = order.getOrderLines().stream().filter(ol -> ol.getQuantity());

我知道这是错误的,因为它没有遍历List<OrderLine>并汇总每行的数量,并且由于filter(...)需要表达式解析为boolean而没有编译,不是int值。

有什么想法我要去哪里吗?

1 个答案:

答案 0 :(得分:5)

您正在寻找Stream.mapToInt(),它将创建一个IntStreamIntStream.sum()。您可以尝试以下方法:

int totalQuantity = order.getOrderLines().stream()
        .mapToInt(OrderLine::getQuantity)
        .sum();

这将汇总订单中所有订单行的总体质量。