我有这个当前逻辑:
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>
[我知道Optionals
和Stream
是两个不同的东西,但是我想知道是否有一种方法可以将它们组合在一起,以便以后可以在Optional<List<?>>
之后再加上Stream
。
由于您以Optional
开头,因此您必须确定Optional
为空时要返回的内容。
一种方法是将Stream
管道放入Optional
的map
中:
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);
如果您使用的是Java 9+,则可以使用Optional.stream
,然后使用flatMap
:
ofNullable(product.getProductPrices())
.map(ProductPrices::getProductPrices)
.stream()
.flatMap(Collection::stream) //assuming getProductPrices returns a Collection
...
Optional.stream
返回空流,如果可选为空。