Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java8流过滤映射后获取原始对象_Java_Java 8_Java Stream - Fatal编程技术网

Java8流过滤映射后获取原始对象

Java8流过滤映射后获取原始对象,java,java-8,java-stream,Java,Java 8,Java Stream,我必须获得未付款发票的收据id。订单有多张收据,收据有发票。我正在使用Java8流。从收据流中,我只能获取发票列表,但我想获取未付款发票的收据id 这是我的密码: List<Invoice> invoicesNotPaid = receipts.stream() .map(ReceiptsVO::getInvoices) .flatMap(List::stream) .map(inv -> Invoice.

我必须获得未付款发票的收据id。订单有多张收据,收据有发票。我正在使用Java8流。从收据流中,我只能获取发票列表,但我想获取未付款发票的收据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());

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

与其使用flatMap丢弃数据,不如使用内部流进行筛选:

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

您可以流式处理
收据
,然后检查收据中至少一个
发票
未付款,然后收集这些收据id

List<Integer> receiptIdNotPaid = receipts.stream()
     .filter(receipt-> receipt.getInvoices().stream()
              .map(inv->Invoice.builder().status(InvoiceStatus.getStatus(inv.getStatus().name())).build())
              .anyMatch(Invoice::hasNotBeenPaid))
     .map(Receipt::getReceiptId)
     .collect(Collectors.toList());
List receiptIdNotPaid=receipts.stream()
.filter(收据->收据.getInvoices().stream())
.map(inv->Invoice.builder().status(InvoiceStatus.getStatus(inv.getStatus().name())).build())
.anyMatch(发票::hasNotBeenPaid))
.map(收据::getReceiptId)
.collect(Collectors.toList());

在receipt类中放入一个布尔方法,该方法将准确地提供该信息。然后,您可以简单地对该谓词进行筛选。为什么要使用生成器将inv映射到新发票?感谢大家的快速响应。这对我很有效。正是我所寻找的。
List<Integer> receiptIdNotPaid = receipts.stream()
     .filter(receipt-> receipt.getInvoices().stream()
              .map(inv->Invoice.builder().status(InvoiceStatus.getStatus(inv.getStatus().name())).build())
              .anyMatch(Invoice::hasNotBeenPaid))
     .map(Receipt::getReceiptId)
     .collect(Collectors.toList());