问题描述
任务:计算具有类别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