【问题标题】:Adding BigDecimal in Stream using reduce method使用 reduce 方法在 Stream 中添加 BigDecimal
【发布时间】:2020-09-21 15:59:33
【问题描述】:

任务:计算 List orderPositions 中类别 A 的产品价格总和。

目标:练习“.reduce”方法

有 3 个类: x 类别枚举(A、B、C、D), x 产品(字符串名称、BigDecimal 价格、BigDecimal 折扣、类别类别) x OrderPositin - 产品数量

问题:App1 类流操作

代码如下

public class Product {

    private String name;
    private BigDecimal price;
    private BigDecimal discount;
    private Category category;

    public Product(String name, BigDecimal price, BigDecimal discount, Category category) {
        this.name = name;
        this.price = price;
        this.discount = discount;
        this.category = category;
    }


public class OrderPosition {

    private Product product;
    private int quantity;

    public OrderPosition() {
    }

    public OrderPosition(Product product, int quantity) {
        this.product = product;
        this.quantity = quantity;
    }


public enum Category {
    A, B, C, D
}

public class App1 {
    public static void main(String[] args) {

        List<OrderPosition> orderPositions = List.of(
                new OrderPosition(new Product("Szynka", new BigDecimal("25"),BigDecimal.ZERO, Category.A), 10),
                new OrderPosition(new Product("Ser", new BigDecimal("25.5"),BigDecimal.ZERO, Category.B), 20),
                new OrderPosition(new Product("Chleb", new BigDecimal("15.5"),BigDecimal.ZERO, Category.C), 10),
                new OrderPosition(new Product("Nabial", new BigDecimal("8"),BigDecimal.ZERO, Category.D), 2),
                new OrderPosition(new Product("Kielbasa", new BigDecimal("15"),BigDecimal.ZERO, Category.A), 10),
                new OrderPosition(new Product("Jajko", new BigDecimal("5"),BigDecimal.ZERO, Category.B), 5)
        );

        Optional<BigDecimal> op = orderPositions
                .stream()
                .filter(orderPosition -> orderPosition.getProduct().getCategory().equals(Category.A))
                .reduce((x,y) -> x.add.y);

提前致谢!!

【问题讨论】:

    标签: java stream reduce


    【解决方案1】:

    映射到大十进制流然后减少

    BigDecimal op = orderPositions
                    .stream()
                    .filter(orderPosition -> Category.A.equals(orderPosition.getProduct().getCategory()))
    .map(orderPosition1 -> orderPosition1.getProduct().getPrice())
    .reduce(BigDecimal.ZERO, BigDecimal::add);
    

    链接: https://mkyong.com/java8/java-8-how-to-sum-bigdecimal-using-stream/ 第一个值(BigDecimal.ZERO)是流为空时的默认值

    请注意,我也更改为 Enum 的相等顺序,以避免 nullPointerException

    【讨论】:

    • 你说得对,完美运行。也感谢您提供更深入解释的链接!
    猜你喜欢
    • 2020-07-08
    • 2021-01-13
    • 1970-01-01
    • 2021-03-02
    • 1970-01-01
    • 1970-01-01
    • 2021-12-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多