首页 > 解决方案 > Java 8 Streams在过滤映射后获取原始对象

问题描述

我必须获取未付款发票的收据 ID。订单有多个收据,收据有发票。我正在使用 Java 8 流。从收据流中,我只能获取发票列表,但我想获取未付款发票的收据 ID

这是我的代码:

List<Invoice> invoicesNotPaid = receipts.stream()
            .map(ReceiptsVO::getInvoices)
            .flatMap(List::stream)
            .map(inv -> Invoice.builder().status(InvoiceStatus.getStatus(inv.getStatus().name())).build())
            .filter(Invoice::hasNotBeenPaid).collect(Collectors.toList());

在最终过滤器之后,我只获得发票,我无法获得原始收据对象参考。在检查收据与未支付的发票后,我必须做一些类似下面的事情。

receipts -> receipt.getReceiptId()

如何获取未付款发票的收据 ID?

标签: javajava-8java-stream

解决方案


不要使用 flatMap 丢弃数据,而是使用内部流进行过滤:

List<Invoice> invoicesNotPaid = receipts.stream()
            .filter(receipt -> receipt.getInvoices().stream().anyMatch(inv -> !hasBeenPaid(inv))
            .collect(Collectors.toList());

推荐阅读