gpt4 book ai didi

java - 使用流 api 对列表数据进行多项操作

转载 作者:行者123 更新时间:2023-11-30 06:55:39 25 4
gpt4 key购买 nike

我有一个计算篮子价格的要求。我正在获取项目列表作为输入,并首先使用 map 计算每个项目的价格。之后,我必须计算购物篮总数并返回 ShoppingBasketOutput。我在下面附上了我的代码,但我不喜欢将 ShoppingBasketOutput 作为参数传递给 calculateBasketPrice 的想法。

你有更好的建议来实现这个要求吗?

public ShoppingBasketOutput getBasketTotalPrice(List<ShoppingItemDTO> itemsDTO) {
ShoppingBasketOutput shoppingBasketOutput = new ShoppingBasketOutput();

itemsDTO.stream()
.map(this::calculateItemPrice)
.forEach((item) -> calculateBasketPrice(shoppingBasketOutput, item));
return shoppingBasketOutput;
}

private ShoppingBasketOutput calculateBasketPrice(ShoppingBasketOutput shoppingBasketOutput, ShoppingItemDTO item) {
shoppingBasketOutput.setSubTotal(shoppingBasketOutput.getSubTotal() + item.getItemSubTotal());
shoppingBasketOutput.setTotalDiscount(shoppingBasketOutput.getTotalDiscount() + item.getTotalItemDiscount());
return shoppingBasketOutput;
}

private ShoppingItemDTO calculateItemPrice(ShoppingItemDTO shoppingItemDTO) {
Optional<ItemEnum> itemEnum = ItemEnum.getItem(shoppingItemDTO.getName());
if (itemEnum.isPresent()) {
ItemEnum item = itemEnum.get();
shoppingItemDTO.setTotalItemDiscount(getItemTotalDiscount(item, shoppingItemDTO.getQuantity()));
shoppingItemDTO.setItemSubTotal(item.getPrice() * shoppingItemDTO.getQuantity());
} else {
throw new ProductNotFoundException();
}
return shoppingItemDTO;
}

最佳答案

你走错了路。

首先记住map(mapper)要求映射函数为:

a non-interfering, stateless function to apply to each element

在您的情况下,它不是无干扰和无状态的,因为您正在修改 Stream 元素,它是您的 ShoppingItemDTO。所以这很糟糕。

我们如何纠正这个问题?好吧,我们需要考虑一下我们想要在这里实现的目标。您的代码为每个 ShoppingItemDTO 计算两个值,然后将它们加在一起生成一个 ShoppingBasketOutput

所以,你想要的是 reduce您的 itemsDTOShoppingBasketOutput 中。要使用的标识是一个新的空 ShoppingBasketOutput。每当我们遇到一个项目时,我们都会将其小计和折扣添加到篮子输出中。第三个参数通过对它们的值求和将两个篮子输出组合在一起。

public ShoppingBasketOutput getBasketTotalPrice(List<ShoppingItemDTO> itemsDTO) {
return itemsDTO.stream().reduce(
new ShoppingBasketOutput(),
(output, item) -> {
ItemEnum itemEnum = ItemEnum.getItem(item.getName()).orElseThrow(ProductNotFoundException::new);
output.setSubTotal(output.getSubTotal() + itemEnum.getPrice() * item.getQuantity());
output.setTotalDiscount(output.getTotalDiscount() + getItemTotalDiscount(itemEnum, item.getQuantity()));
return output;
},
(output1, output2) -> {
output1.setSubTotal(output1.getSubTotal() + output2.getSubTotal());
output1.setTotalDiscount(output1.getTotalDiscount() + output2.getTotalDiscount());
return output1;
}
);
}

请注意,通过引入 addToSubTotal(amount)addToTotalDiscount(amount) 两种方法,您可以使这段代码更简洁。使用此类方法,您需要获取和设置新值。

关于java - 使用流 api 对列表数据进行多项操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35106702/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com