Java 使用reduce方法在流中添加BigDecimal

Java 使用reduce方法在流中添加BigDecimal,java,stream,reduce,Java,Stream,Reduce,任务:从具有类别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 disco

任务:从具有类别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);
公共类产品{
私有字符串名称;
私人价格;
私人折扣;
私人类别;
公共产品(字符串名称、BigDecimal价格、BigDecimal折扣、类别){
this.name=名称;
这个价格=价格;
这个。折扣=折扣;
this.category=类别;
}
公共类OrderPosition{
私人产品;
私人整数数量;
公共秩序职位(){
}
公共订单位置(产品、整数数量){
本产品=产品;
这个。数量=数量;
}
公共枚举类别{
A、 B、C、D
}
公共类App1{
公共静态void main(字符串[]args){
List orderPositions=List.of(
新订单位置(新产品(“Szynka”、新BigDecimal(“25”)、BigDecimal.ZERO、Category.A)、10),
新订单位置(新产品(“Ser”)、新的BigDecimal(“25.5”)、BigDecimal.ZERO、Category.B)、20),
新订单位置(新产品(“Chleb”)、新的BigDecimal(“15.5”)、BigDecimal.ZERO、Category.C)、10),
新订单位置(新产品(“Nabial”)、新的BigDecimal(“8”)、BigDecimal.ZERO、Category.D)、2),
新订单位置(新产品(“Kielbasa”)、新的BigDecimal(“15”)、BigDecimal.ZERO、Category.A)、10),
新订单位置(新产品(“Jajko”、新的BigDecimal(“5”)、BigDecimal.ZERO、Category.B)、5)
);
可选op=订单位置
.stream()
.filter(orderPosition->orderPosition.getProduct().getCategory().equals(Category.A))
.减少((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);
链接: 第一个值(BigDecimal.ZERO)是流为空时的默认值


请注意,为了避免nullPointerException(nullPointerException),我还将枚举的顺序更改为相等。您是对的,它工作得非常完美。感谢链接到更深入的解释!