【问题标题】:Java 8: Introduce streams and lambdas to methodJava 8:将流和 lambda 引入方法
【发布时间】: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


【解决方案1】:

您可以使用流重构其中的某些部分。

(作为建议,您应该首先将此函数重构为小步骤,即使它们不使用流。)

请记住创建具有有意义名称的小函数。

你可以有类似使用流的东西

kart.getItems().stream()
    .filter(it -> containsId(it))
    .map(it -> legacyMethodHere(it))
    .collect(Collectors.toList());

您也可以使用peek() 并将Consumer 传递给它,这是一个返回void 的函数。如果您有副作用,例如将 smth 添加到 cnt,则很有用。

由于流更具“功能性”,您应该将其用作函数流,这些函数不应该有副作用并且是可预测的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-02
    • 2016-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多