使用Java Stream API汇总嵌套列表

hot*_*oup 3 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
}
Run Code Online (Sandbox Code Playgroud)

我正在尝试找到一种Java 8“ Streamy”方式来获取订单中所有订单行的总数。获取该计数的“旧”方法如下所示:

int totalQuantity = 0;
for (OrderLine ol : order.getOrderLines()) {
    totalQuantity += ol.getQuantity();  
}
Run Code Online (Sandbox Code Playgroud)

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

Integer totalQuantity = order.getOrderLines().stream().filter(ol -> ol.getQuantity());
Run Code Online (Sandbox Code Playgroud)

我知道这是错误的,因为它没有迭代List<OrderLine>和求和每行的数量,并且它不编译,因为filter(...)需要将表达式解析为a boolean而不是int值。

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

Sam*_*ipp 5

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

int totalQuantity = order.getOrderLines().stream()
        .mapToInt(OrderLine::getQuantity)
        .sum();
Run Code Online (Sandbox Code Playgroud)

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