{ -6ren">
gpt4 book ai didi

java 8并行流问题

转载 作者:行者123 更新时间:2023-12-02 16:20:27 25 4
gpt4 key购买 nike

    _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);
});

代码的问题是,当我从数据库获取响应时,在使用并行流进行迭代时,数据大小每次都不同,而在使用顺序流时则工作正常。

我无法使用顺序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());

顺便说一句,我可能会更改匿名类实例的创建,并使用命名类的构造函数来创建 SaleAggrData 实例。

关于java 8并行流问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48900204/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com