//总总量 BigDecimal deliveryWgt = new BigDecimal(0); List<StkPrdMaterialInfoVO> prdInfoOfWgt = stkprdPrdInfoService.selectWgtByRlotnoAndPrdNo( details, deliveryInfoDTOShip.getDeliveryCode()); List<StkPrdMaterialInfoVO> tldMXOfWgt = stkprdLcWlTldMxService.getWlTldMXWaitWgt( model.getPickupCode()); //校验数据 Map<String, StkPrdMaterialInfoVO> prdInfoMap = new HashMap<>(2); //根据物料编码把配货单重量转换成map结构 for (StkPrdMaterialInfoVO mater : prdInfoOfWgt) { prdInfoMap.put(mater.getMatCode(), mater); deliveryWgt = deliveryWgt.add(mater.getActWgt()); } //根据物料编码把提料单明细重量转换成map结构 Map<String, StkPrdMaterialInfoVO> tldMXMap = new HashMap<>(2); for (StkPrdMaterialInfoVO mater : tldMXOfWgt) { tldMXMap.put(mater.getMatCode(), mater); } //物料相同的重量进行比对 for (Map.Entry<String, StkPrdMaterialInfoVO> entry : prdInfoMap.entrySet()) { String key = entry.getKey(); StkPrdMaterialInfoVO mater = entry.getValue(); StkPrdMaterialInfoVO mater1 = tldMXMap.get(key); if (mater.getActWgt().compareTo(mater1.getWaitWgt()) > 0) { throw new CustomException(model.getPickupCode() + "提料单超出待发运重量,保存失败!"); } }优化
时间: 2024-02-14 13:36:13 浏览: 45
这段代码可以进行以下优化:
1.在循环前,可以将 prdInfoOfWgt 和 tldMXOfWgt 中的物料按照物料编码排序,这样可以减少后面的查找次数。
2.可以使用 BigDecimal 的 compareTo 方法来进行比较,而不是使用 if 判断。
3.可以将两个 map 的创建提到循环前面,避免在循环中重复创建。
4.可以使用 try-catch 块来捕获异常,而不是抛出自定义异常。
相关问题
StSoftwareEchoEntity stSoftwareEchoEntity = new StSoftwareEchoEntity(); //类型全部数量 List<StSoftwareEchoEntity> stSoftwareEchoEntityList4 = typeListMap.get(integer); //正确数量 List<StSoftwareEchoEntity> stSoftwareEchoEntityList3 = exactnessTypeListMap.get(integer); if (ToolUtil.isNotEmpty(stSoftwareEchoEntityList3)) { Double a = (double) stSoftwareEchoEntityList3.size() / (double) stSoftwareEchoEntityList4.size(); BigDecimal bigDecimal = new BigDecimal(a).setScale(2, BigDecimal.ROUND_DOWN); double newDouble = bigDecimal.doubleValue(); Double score = (newDouble * 100); BigDecimal bigDecimal1 = new BigDecimal(score).setScale(2, BigDecimal.ROUND_DOWN); stSoftwareEchoEntity.setUserId(aLong); stSoftwareEchoEntity.setQuestionTypeId(integer); stSoftwareEchoEntity.setProportion(bigDecimal1.doubleValue()); integerList.add(stSoftwareEchoEntity); userMap.put(Integer.valueOf(integer), bigDecimal1.doubleValue()); } else { userMap.put(Integer.valueOf(integer), 0.0); }
这段代码没有明确的问题描述,不过看起来是计算概率的代码,其中有几个可以优化的地方:
1. `if (ToolUtil.isNotEmpty(stSoftwareEchoEntityList3))` 中的判断可以改为 `if (!stSoftwareEchoEntityList3.isEmpty())`,这样可以简化代码。
2. 可以将 `(double) stSoftwareEchoEntityList3.size()` 和 `(double) stSoftwareEchoEntityList4.size()` 提取出来,避免在每次循环中重复计算。
3. 可以使用方法引用来简化代码,例如 `(double) stSoftwareEchoEntityList3.size()` 可以改为 `Double.valueOf(stSoftwareEchoEntityList3.size())`。
4. 可以将 `BigDecimal` 的 `setScale()` 方法的第二个参数改为 `RoundingMode.DOWN`,这样可以更清晰地表达代码的意图。
下面是优化后的代码:
```
StSoftwareEchoEntity stSoftwareEchoEntity = new StSoftwareEchoEntity();
List<StSoftwareEchoEntity> stSoftwareEchoEntityList4 = typeListMap.get(integer);
List<StSoftwareEchoEntity> stSoftwareEchoEntityList3 = exactnessTypeListMap.get(integer);
if (!stSoftwareEchoEntityList3.isEmpty()) {
double size3 = Double.valueOf(stSoftwareEchoEntityList3.size());
double size4 = Double.valueOf(stSoftwareEchoEntityList4.size());
double proportion = size3 / size4;
double score = proportion * 100;
stSoftwareEchoEntity.setUserId(aLong);
stSoftwareEchoEntity.setQuestionTypeId(integer);
stSoftwareEchoEntity.setProportion(BigDecimal.valueOf(score).setScale(2, RoundingMode.DOWN).doubleValue());
integerList.add(stSoftwareEchoEntity);
userMap.put(integer, stSoftwareEchoEntity.getProportion());
} else {
userMap.put(integer, 0.0);
}
```
这个优化后的代码简化了计算概率的过程,也减少了重复计算,提高了代码的可读性和性能。
解释下面代码的意思: Map<String,HashMap> meterEnergyMap =list.stream().collect(Collectors.toMap((item->MapUtils.getString(item, "meterNo")),item->item)); for (RankDataVo vo : topList) { // BigDecimal value = list.stream().filter(t -> vo.getSnList().contains(MapUtils.getString(t, "meterNo")) // && StringUtils.isNotBlank(MapUtils.getString(t, "totalValue"))).map(t -> new BigDecimal(MapUtils.getString(t, "totalValue"))).reduce(BigDecimal.ZERO, BigDecimal::add); BigDecimal value = BigDecimal.ZERO; List<String> itemSnList = vo.getSnList(); if(!CollectionUtils.isEmpty( itemSnList)){ value = itemSnList.stream().map(t->{ Map meterEnergy = meterEnergyMap.get(t); if(meterEnergy==null){ return BigDecimal.ZERO; } return new BigDecimal(MapUtils.getString(meterEnergyMap.get(t), "totalValue")); } ).reduce(BigDecimal.ZERO, BigDecimal::add); } vo.setValue(NumberUtil.round(value, 2, RoundingMode.HALF_UP)); } topList = topList.stream().filter(t -> t.getValue() != null).sorted(Comparator.comparing(RankDataVo::getValue).reversed()).collect(Collectors.toList());
这段代码的意思是:
首先根据列表`list`中每个元素的`meterNo`属性作为key,将整个元素作为value,生成一个`Map<String, HashMap>`类型的变量`meterEnergyMap`。
然后遍历另一个列表`topList`中的每个元素`vo`,将其`snList`属性中的每个元素`sn`作为key,从`meterEnergyMap`中取出对应的value,如果不存在则返回0;否则将对应value的`totalValue`属性转换成BigDecimal类型,然后通过`reduce`方法将所有元素的值相加,得到一个BigDecimal类型的总和`value`,并将其设置为当前元素`vo`的`value`属性。
最后,对`topList`进行筛选和排序,去除`value`为空的元素,并按照`value`的大小从大到小排序,最终返回排好序的列表。
阅读全文