如何在流中结合统计数据和映射器?
How to combine stats and mapper in streams?
public static PriceRangeData getCanonicalPriceRange(final ProductData productDataParent) {
if (MapUtils.isNotEmpty(productDataParent.getAggregates())
&& null != productDataParent.getAggregates().get(DtCoreConstants.RANGED_DATA)) {
final PriceRangeData data = new PriceRangeData();
final Map<String, Double> mapPrices = productDataParent.getRangeMapPrices();
final List<ProductData> ranges = (List<ProductData>) productDataParent.getAggregates()
.get(DtCoreConstants.RANGED_DATA);
if(MapUtils.isNotEmpty(mapPrices)) {
ranges.stream()
.map(productData -> getMapUpdatedData(mapPrices, productData));
}
final DoubleSummaryStatistics stats = ranges.stream()
.collect(Collectors.summarizingDouble(ProductData::getRawPrice));
if (null != stats) {
PriceData minPrice = new PriceData();
minPrice.setValue(new BigDecimal(stats.getMin()));
data.setMinPrice(minPrice);
PriceData maxPrice = new PriceData();
maxPrice.setValue(new BigDecimal(stats.getMax()));
data.setMaxPrice(maxPrice);
}
return data;
}
return null;
}
private static ProductData getMapUpdatedData(final Map<String, Double> mapPrices, final ProductData productData) {
if (mapPrices.containsKey(productData.getCode())) {
productData.setRawPrice(mapPrices.get(productData.getCode()));
}
return productData;
}
有没有办法结合
if(MapUtils.isNotEmpty(mapPrices)) {
ranges.stream()
.map(productData -> getMapUpdatedData(mapPrices, productData));
}
和
final DoubleSummaryStatistics stats = ranges.stream()
.collect(Collectors.summarizingDouble(ProductData::getRawPrice));
通过引用 getRawPrice 的本地方法而不是 ProductData.getRawPrice。目前我们正在将 rawPrice 更新为 mapPrice 中的那些(如果它们存在),然后重做统计数据流。有没有一种方法可以做到这一点而不必先更新,而只是使用本地方法输入值来计算 summarizingDouble
中的统计信息
就像在下面的 Collectors.summarizingDouble 方法中使用
private Double getRawPrice(final Map<String, Double> mapPrices, final ProductData productData) {
if (mapPrices.containsKey(productData.getCode())) {
return mapPrices.get(productData.getCode());
}
return productData.getRawPrice();
}
据我了解你需要
ranges.stream()
.map(productData -> mapPrices.getOrDefault(productData.getCode(), productData.getRawPrice()))
.collect(Collectors.summarizingDouble(x->x));
public static PriceRangeData getCanonicalPriceRange(final ProductData productDataParent) {
if (MapUtils.isNotEmpty(productDataParent.getAggregates())
&& null != productDataParent.getAggregates().get(DtCoreConstants.RANGED_DATA)) {
final PriceRangeData data = new PriceRangeData();
final Map<String, Double> mapPrices = productDataParent.getRangeMapPrices();
final List<ProductData> ranges = (List<ProductData>) productDataParent.getAggregates()
.get(DtCoreConstants.RANGED_DATA);
if(MapUtils.isNotEmpty(mapPrices)) {
ranges.stream()
.map(productData -> getMapUpdatedData(mapPrices, productData));
}
final DoubleSummaryStatistics stats = ranges.stream()
.collect(Collectors.summarizingDouble(ProductData::getRawPrice));
if (null != stats) {
PriceData minPrice = new PriceData();
minPrice.setValue(new BigDecimal(stats.getMin()));
data.setMinPrice(minPrice);
PriceData maxPrice = new PriceData();
maxPrice.setValue(new BigDecimal(stats.getMax()));
data.setMaxPrice(maxPrice);
}
return data;
}
return null;
}
private static ProductData getMapUpdatedData(final Map<String, Double> mapPrices, final ProductData productData) {
if (mapPrices.containsKey(productData.getCode())) {
productData.setRawPrice(mapPrices.get(productData.getCode()));
}
return productData;
}
有没有办法结合
if(MapUtils.isNotEmpty(mapPrices)) {
ranges.stream()
.map(productData -> getMapUpdatedData(mapPrices, productData));
}
和
final DoubleSummaryStatistics stats = ranges.stream()
.collect(Collectors.summarizingDouble(ProductData::getRawPrice));
通过引用 getRawPrice 的本地方法而不是 ProductData.getRawPrice。目前我们正在将 rawPrice 更新为 mapPrice 中的那些(如果它们存在),然后重做统计数据流。有没有一种方法可以做到这一点而不必先更新,而只是使用本地方法输入值来计算 summarizingDouble
中的统计信息就像在下面的 Collectors.summarizingDouble 方法中使用
private Double getRawPrice(final Map<String, Double> mapPrices, final ProductData productData) {
if (mapPrices.containsKey(productData.getCode())) {
return mapPrices.get(productData.getCode());
}
return productData.getRawPrice();
}
据我了解你需要
ranges.stream()
.map(productData -> mapPrices.getOrDefault(productData.getCode(), productData.getRawPrice()))
.collect(Collectors.summarizingDouble(x->x));