【发布时间】:2021-01-25 13:21:59
【问题描述】:
我一直在研究这个Java 方法,它根据特定标准计算物品的价格。
我设法以经典的迭代方式编写它,但我想
使用流和 lambda 重写(或部分)。
任何朝着正确方向的建议或指导都会很重要
赞赏。
谢谢。
这是我的方法:
private void quantityBasedDiscount(Kart kart) {
BigDecimal totalDiscount = BigDecimal.ZERO;
BigDecimal cnt = new BigDecimal(0);
List<Long> idsChekcked = new ArrayList<>();
var items = kart.getItems();
final var size = items.size();
for (int i = 0; i < size; i++) {
if (idsChekcked.contains(items.get(i).getId()) ||
items.get(i).getQuantityDiscountThreshold().compareTo(BigDecimal.ZERO) == 0) {
continue;
}
cnt = cnt.add(BigDecimal.valueOf(1));
for (int j = i + 1; j < size; j++) {
if (items.get(j).getId() == items.get(i).getId()) {
cnt = cnt.add(BigDecimal.valueOf(1));
}
}
final var quantityDiscountThreshold = items.get(i).getQuantityDiscountThreshold();
if (cnt.compareTo(quantityDiscountThreshold) >= 0) {
cart.setMessage("Discount is applied");
for (int k = 0; k < size; k++) {
if (items.get(k).getId() == items.get(i).getId()) {
final var item = items.get(k);
item.setDiscount(item.getPrice().subtract(item.getQuantityDiscountValue()));
final BigDecimal discount = item.getDiscount();
cart.getItems().get(k).setDiscount(discount);
totalDiscount = totalDiscount.add(discount);
}
}
idsChekcked.add(items.get(i).getId());
}
}
kart.setTotal(cart.getTotal().subtract(totalDiscount));
kart.setTotalDiscount(totalDiscount);
}
【问题讨论】:
-
"但我想使用流和 lambdas 重写它(或部分)"为什么?您认为优势是什么?
-
您的代码有效吗?你知道你的代码是做什么的吗?当你用 lambdas/streams 重写它时,你希望得到什么好处?
-
将其转换为使用流的代码太复杂,即使您这样做,我认为代码也将不可读,最好保持原样
-
我只是想通过查看相同代码的两个实现来建立迭代和声明式风格之间的联系。当我在教程中阅读有关 Java 8 功能的信息时,我明白了,但是我很难从采用我编写的东西并用 Java 8 重写它来实现跳跃。现在的代码可以正常工作
标签: java lambda java-8 java-stream