首页 > 解决方案 > 如何在 Java 8 中对 json 对象求和

问题描述

JSON: {productDetails=[{amount=20000.0, rValue=10000.00}, {amount=80000.0, rValue=6000.00} {amount=70000.0, rValue=0}]

我必须根据 rValue 和金额来获取 totalValue。

如果 rValue != 0 则仅对 rValues 求和,即 10000+6000 = 16000 否则,得到金额 = 70000

然后 totalValue = 右值 + 金额 (16000+70000)

请,任何人都可以建议我如何使用Java8。

List<Map> products= (List)products.get("productDetails");


    
    for (Map<String, Object> scheme : products) {
        log.info("scheme " + scheme.toString());
        BigDecimal rValue = Optional.ofNullable(scheme.get("rValue "))
            .map(Object::toString)
            .map(BigDecimal::new)
            .orElse(BigDecimal.ZERO);
        
        BigDecimal amount = Optional.ofNullable(scheme.get("amount"))
            .map(Object::toString)
            .map(BigDecimal::new)
            .orElse(BigDecimal.ZERO);


        log.debug("rValue : " + rValue );
        log.debug("amount: " + amount);

标签: jsonapijava-8

解决方案


你需要的是:

BigDecimal reduced = products.stream().map(x -> {
            if (x.getrValue() != BigDecimal.ZERO)
                return x.getrValue();
            else return x.getAmount();
        }).reduce(BigDecimal.ZERO, BigDecimal::add);

完整示例:

public class Ex1 {

    public static void main(String[] args) {
        List<Product> products = new ArrayList<>(Arrays.asList(
             new Product(new BigDecimal(20000), new BigDecimal(10000)),
             new Product(new BigDecimal(80000), new BigDecimal(6000)),
             new Product(new BigDecimal(70000), BigDecimal.ZERO)
        ));

        BigDecimal reduced = products.stream().map(x -> {
            if (x.getrValue() != BigDecimal.ZERO)
                return x.getrValue();
            else return x.getAmount();
        }).reduce(BigDecimal.ZERO, BigDecimal::add);

        System.out.println(reduced);

    }
}

class Product {
    BigDecimal amount;
    BigDecimal rValue;

    public Product(BigDecimal amount, BigDecimal rValue) {
        this.amount = amount;
        this.rValue = rValue;
    }

    public BigDecimal getAmount() {
        return amount;
    }

    public void setAmount(BigDecimal amount) {
        this.amount = amount;
    }

    public BigDecimal getrValue() {
        return rValue;
    }

    public void setrValue(BigDecimal rValue) {
        this.rValue = rValue;
    }
}

结果是:86000


推荐阅读