如何使用.map()/.filters()添加不同类中存在的不同变量



我在不同的对象中有三种不同类型的费用(cost、deliveryServiceFee和fee(,我想把它们加起来,放在一个名为"totalDeliveryFee";。

以下是类别:

CartEntry.java

package core.aggreagte
public class CartEntry {
@NotNull
@Valid
private Fulfillment fulfillment;
@DecimalMin("0.0")
private BigDecimal totalDeliveryFee;
}

履行.java

package core.aggreagte
public class Fulfillment {
@Valid
private StoreDelivery storeDelivery;
}

StoreDelivery.java

package core.aggreagte
public class StoreDelivery {
@DecimalMin("0.0")
private BigDecimal cost;
@DecimalMin("0.0")
private BigDecimal deliveryServiceFee;
private DeliveryWindow deliveryWindow;
}

DeliveryWindow.java

package core.aggreagte
public class DeliveryWindow {
@DecimalMin("0.0")
private BigDecimal fee;
}

所有三个变量的求和发生在Calculator.java中到目前为止,我得到的是:

CartEntryTotalDeliveryFeeCalculator.java

package core.calculator.cartEntry.impl;
import core.aggregate.CartEntry;
import core.aggregate.Fullfillment;
import core.aggregate.StoreDelivery;
import core.calculator.cartEntry.CartEntryCalculator
public class CartEntryTotalDeliveryFeeCalculator implements CartEntryCalculator{
@Override
public void calculate(final CartEntry cartEntry {
Optional.of(cartEntry).filter(fulfillment -> Objects.nonNull(fulfillment.getFulfillment())).map(CartEntry::getFulfillment)
.filter(storeDelivery -> Objects.nonNull(storeDelivery.getStoreDelivery()))
.map(Fulfillment::getStoreDelivery).filter(deliveryFee -> Objects.nonNull(deliveryFee.getCost()))
.filter(serviceFee -> Objects.nonNull(serviceFee.getDeliveryServiceFee()))
.map(StoreDelivery::getDeliveryWindow).filter(windowFee -> Objects.nonNull(windowFee.getFee()));
}
}

由于无法修改这些类,因此需要依赖这些类的每个getter方法。而且,由于所有需要的值都是CartEntry类的组件和子组件,所以您只需要创建一个所有满足的流,并使用getter方法来累积每个值的总和。

List<CartEntry> entries = List.of(new CartEntry(), new CartEntry());

double total =
entries.stream()
.mapToDouble(entry -> entry.getTotalDeliveryFee()
.add(entry.getFulfillment().getStoreDelivery().getCost()
.add(entry.getFulfillment().getStoreDelivery()
.getDeliveryServiceFee().add(entry.getFulfillment()
.getStoreDelivery().getDeliveryWindow().getFee())))
.doubleValue())
.sum();     

它从CartEntry类的组件和子组件中收集所有总计。

最后一个观察:由于类使用注释来保证";不为空";对象,并且对于最小值为0.0的十进制值,我的假设是实际上不需要使用OptionalCartEntry的所有子组件似乎都是自动创建的,其值为0.0。如果这个假设是正确的,那么上面的函数应该可以正常工作。如果这个假设不正确,那么它将被要求使用Optional.of(),然后为空十进制值返回0.0。

最新更新