Rav*_*lor 2 java parallel-processing java-8 parallel.foreach
_logger.info("data size : "+saleData.size);
saleData.parallelStream().forEach(data -> {
SaleAggrData saleAggrData = new SaleAggrData() {
{
setCatId(data.getCatId());
setRevenue(RoundUpUtil.roundUpDouble(data.getRevenue()));
setMargin(RoundUpUtil.roundUpDouble(data.getMargin()));
setUnits(data.getUnits());
setMarginRate(ComputeUtil.marginRate(data.getRevenue(), data.getMargin()));
setOtd(ComputeUtil.OTD(data.getRevenue(), data.getUnits()));
setSaleDate(data.getSaleDate());
setDiscountDepth(ComputeUtil.discountDepth(data.getRegularPrice(), data.getRevenue()));
setTransactions(data.getTransactions());
setUpt(ComputeUtil.UPT(data.getUnits(), data.getTransactions()));
}
};
salesAggrData.addSaleAggrData(saleAggrData);
});
Run Code Online (Sandbox Code Playgroud)
代码的问题是当我从DB获得响应时,并且在使用并行流进行迭代时,每次数据大小都不同,而使用顺序流时,它工作正常.
我不能使用顺序Stream因为数据很大并且需要时间.
任何领导都会有所帮助.
您正在并行添加元素salesAggrData,我假设它是一些Collection.如果它不是一个线程安全的Collection,难怪你会得到不一致的结果.
而不是forEach,为什么不使用map()然后将结果收集到一些Collection?
List<SaleAggrData> salesAggrData =
saleData.parallelStream()
.map(data -> {
SaleAggrData saleAggrData = new SaleAggrData() {
{
setCatId(data.getCatId());
setRevenue(RoundUpUtil.roundUpDouble(data.getRevenue()));
setMargin(RoundUpUtil.roundUpDouble(data.getMargin()));
setUnits(data.getUnits());
setMarginRate(ComputeUtil.marginRate(data.getRevenue(), data.getMargin()));
setOtd(ComputeUtil.OTD(data.getRevenue(), data.getUnits()));
setSaleDate(data.getSaleDate());
setDiscountDepth(ComputeUtil.discountDepth(data.getRegularPrice(), data.getRevenue()));
setTransactions(data.getTransactions());
setUpt(ComputeUtil.UPT(data.getUnits(), data.getTransactions()));
}
};
return saleAggrData;
})
.collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)
顺便说一下,我可能会更改匿名类实例的创建,并使用命名类的构造函数来创建SaleAggrData实例.
| 归档时间: |
|
| 查看次数: |
1186 次 |
| 最近记录: |