如何将可选映射转换为Java中的流映射

问题描述 投票:1回答:2

我有这个当前逻辑:

    List<String> priceUnitCodes = ofNullable(product.getProductPrices())
            .map(ProductPrices::getProductPrices)
            .flatMap(productPrices -> productPrices.stream()) // << error highlight
            .map(ProductPrice::getPriceBase)
            .map(PriceBase::getPriceUnit)
            .map(UniversalType::getCode)
            .collect(Collectors.toList());

在IntelliJ中flatMap部分突出显示,并显示以下错误提示:

no instance(s) of type variable(s) U exist so that Stream<ProductPrice> conforms to  Optional<? extends U>

[我知道OptionalsStream是两个不同的东西,但是我想知道是否有一种方法可以将它们组合在一起,以便以后可以在Optional<List<?>>之后再加上Stream

java java-stream optional
2个回答
2
投票

由于您以Optional开头,因此您必须确定Optional为空时要返回的内容。

一种方法是将Stream管道放入Optionalmap中:

List<String> priceUnitCodes = ofNullable(product.getProductPrices())
        .map(ProductPrices::getProductPrices)
        .map(productPrices -> productPrices.stream()
                                           .map(ProductPrice::getPriceBase)
                                           .map(PriceBase::getPriceUnit)
                                           .map(UniversalType::getCode)
                                           .collect(Collectors.toList())
        .orElse(null);

或者,当然,如果map管道内的Stream操作可能返回null,则将需要进行其他更改(以避免NullPointerException)。

另一方面,如果它们从不返回null,则可以将它们链接为单个map

List<String> priceUnitCodes = ofNullable(product.getProductPrices())
        .map(ProductPrices::getProductPrices)
        .map(productPrices -> productPrices.stream()
                                           .map(pp -> pp.getPriceBase().getPriceUnit().getCode())
                                           .collect(Collectors.toList())
        .orElse(null);

0
投票

如果您使用的是Java 9+,则可以使用Optional.stream,然后使用flatMap

ofNullable(product.getProductPrices())
.map(ProductPrices::getProductPrices)
.stream()
.flatMap(Collection::stream) //assuming getProductPrices returns a Collection
...

Optional.stream返回空流,如果可选为空。

© www.soinside.com 2019 - 2024. All rights reserved.