使用reduce方法在Stream中添加BigDecimal

问题描述

任务:计算具有类别A的列表orderPosition的产品价格总和。

目标:练习“ .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"),Category.B),20),new OrderPosition(new Product("Chleb",new BigDecimal("15.5"),Category.C),new OrderPosition(new Product("Nabial",new BigDecimal("8"),Category.D),2),new OrderPosition(new Product("Kielbasa",new BigDecimal("15"),new OrderPosition(new Product("Jajko",new BigDecimal("5"),5)
        );

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

提前谢谢!

解决方法

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

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