在java 8中并行使用BigDecimal进行分组和求和
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了在java 8中并行使用BigDecimal进行分组和求和,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含4134字,纯文字阅读大概需要6分钟。
内容图文
![在java 8中并行使用BigDecimal进行分组和求和](/upload/InfoBanner/zyjiaocheng/789/e826f1c49b0445e7a201e03fe13ee27a.jpg)
我有一个产品列表,其中包含其中一个属性.并且列表可以包含公共产品名称,其他属性不同.所以我想按产品和使用分组和求和在java 8中共享公用名的产品数量的总和对列表进行分组.
Example:
[
{
"name":"Product A",
"amount":"40.00",
"description":"Info1",
"number":"65"
},
{
"name":"Product A",
"amount":"50.00",
"description":"Info2",
"number":"67"
},
{
"name":"Product A",
"amount":"100.00",
"description":"Info3",
"number":"87"
},
{
"name":"Product B",
"amount":"45.00",
"description":"Info4",
"number":"86"
},
{
"name":"Product D",
"amount":"459.00",
"description":"Info5",
"number":"7"
},
{
"name":"Product B",
"amount":"50.00",
"description":"Info6",
"number":"8"
}
]
输出应该类似于:
{
"Product A = 190.00":[
{
"name":"Product A",
"amount":"40.00",
"description":"Info1",
"number":"65"
},
{
"name":"Product A",
"amount":"50.00",
"description":"Info2",
"number":"67"
},
{
"name":"Product A",
"amount":"100.00",
"description":"Info3",
"number":"87"
}
],
"Product B=95.00":[
{
"name":"Product B",
"amount":"45.00",
"description":"Info4",
"number":"86"
},
{
"name":"Product B",
"amount":"50.00",
"description":"Info6",
"number":"8"
}
],
"Product D = 459.00":[
{
"name":"Product D",
"amount":"459.00",
"description":"Info5",
"number":"7"
}
]
我创建了一个bean类ProductBean,它包含所有字段(名称,数量,描述和数字)以及相同的getter和setter.
而且productBeans列出了所有产品.
Map<String, List<ProductBean>> groupByProduct =
productBeans.stream()
.collect(Collectors.groupingBy(item -> item.getName()))
Map<String, BigDecimal> result =
productBeans.stream()
.collect(Collectors.groupingBy(ProductBean::getName,
Collectors.mapping(ProductBean::getAmount,
Collectors.reducing(BigDecimal.ZERO, BigDecimal::add))));
groupByProduct包含按名称分组的产品列表.
结果以产品的关键字和产品的总量作为值.
但在这里,我试图将产品和总金额映射到产品列表.我试图结合上面的代码来获得预期的输出,但无法实现.通过迭代地图已经实现了同样的目的.
但是,在合并上述代码以获取产品名称和数量作为键并列为值的地图时,任何帮助都会有所帮助.
解决方法:
看起来你想要像Map< String,BigDecimal,List< ProductBean>>这样的东西.其中String表示名称,BigDecimal是所有Product的金额和List< ProductBean>的总和.是该特定组中的产品列表.
这样的地图是不可能的,所以相反,你已经设法分两步执行,效率不高,并没有将相关数据保存在一起,而是将它分成两个地图.
我的建议是创建一个包装类,如下所示:
class ResultSet {
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public BigDecimal getAmount() {
return amount;
}
public void setAmount(BigDecimal amount) {
this.amount = amount;
}
public List<ProductBean> getProductBeans() {
return productBeans;
}
public void setProductBeans(List<ProductBean> productBeans) {
this.productBeans = productBeans;
}
private String name;
private BigDecimal amount;
private List<ProductBean> productBeans;
@Override
public String toString() {
return "ResultSet{" +
"name='" + name + '\'' +
", amount=" + amount +
", productBeans=" + productBeans +
'}';
}
}
这将包装给定的一组ProductBean维护相关数据,以提高可维护性和可读性.
现在,您可以通过以下方式完成手头的任务:
List<ResultSet> result = productList.stream()
.collect(Collectors.groupingBy(ProductBean::getName))
.entrySet()
.stream()
.map(e -> {
ResultSet resultSet = new ResultSet();
BigDecimal sum = e.getValue().stream()
.map(ProductBean::getAmount)
.reduce(BigDecimal.ZERO, BigDecimal::add);
resultSet.setName(e.getKey());
resultSet.setAmount(sum);
resultSet.setProductBeans(e.getValue());
return resultSet;
}).collect(Collectors.toList());
它按ProductBean名称分组,然后将每个组映射到ResultSet实例,该实例将封装名称,该特定组中的金额总和以及组中的整个ProductBean.
您可以通过创建映射方法来进一步重构上述流查询:
private static ResultSet mapToResultSet(Map.Entry<String, List<ProductBean>> e) {
ResultSet resultSet = new ResultSet();
BigDecimal sum = e.getValue().stream()
.map(ProductBean::getAmount)
.reduce(BigDecimal.ZERO, BigDecimal::add);
resultSet.setName(e.getKey());
resultSet.setAmount(sum);
resultSet.setProductBeans(e.getValue());
return resultSet;
}
因此,将流查询呈现为:
List<ResultSet> result = productList.stream()
.collect(Collectors.groupingBy(ProductBean::getName))
.entrySet()
.stream()
.map(Main::mapToResultSet) // Main representing the class containing the mapToResultSet method
.collect(Collectors.toList());
内容总结
以上是互联网集市为您收集整理的在java 8中并行使用BigDecimal进行分组和求和全部内容,希望文章能够帮你解决在java 8中并行使用BigDecimal进行分组和求和所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。