json - 如何在 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);
解决方案
你需要的是:
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
推荐阅读
- netsuite - NetSuite Suitelet 自定义 HTML | 在表单上按提交会导致值为空
- docker - Docker 无法使用 Dockerfile 构建 docker 映像,没有这样的文件或目录(尽管 Dockerfile 存在,并且拼写正确,没有扩展名)
- python - 我可以在 python 中修改语言环境 localeconv() 的一部分吗
- reactjs - onChangeText 返回对象 Object 而不是值
- regex - 正则表达式以适合 4 位小数的百分比模式?
- excel - Excel 公式参数过多
- javascript - 在 NodeJS 中输入空字符串
- c# - Blazor.Server 和 Asp.Net Web API 有什么区别?
- docker - 使用 ocelot 和 docker 服务使用路由 ApiGateway 时出错
- amazon-dynamodb-local - 使用 AWS Workbench 从本地容器中删除 dynamodb 表