优化这段代码stationCode = excelData.getStationNo(); if ("".equals(stationCode)) { errSet.add(ERR_STATION_CODE_NULL); } else if (relId!=null){ // 存入的excel表单中同一个产线下有重复的工位 stationCodes = stationCheckMap.get(relId); // sortId添加 WorkShopLineSortIdPojo maxSortIdPojo = sortIdList.stream().filter(item -> item.getRelId().equals(postStation.getRelId())).findFirst().orElse(null); maxSortId = null; if (maxSortIdPojo!=null){ maxSortId = maxSortIdPojo.getMaxSortId(); } if (stationCodes!=null){ // 重复列表中有此产线下的工位,但此产线下无工位,顺位添加 if (maxSortId == null){ postStation.setSortId(stationCodes.size()); }else { // 重复列表中有此产线下的工位,但此产线下有工位,顺位添加 postStation.setSortId(maxSortId+stationCodes.size()+1); } f = stationCodes.stream().anyMatch(item -> item.equals(excelData.getStationNo())); if (f){ // excel表中重复工位号的产线相同 errSet.add(ERR_STATION_CODE_REPEAT); } } else { // 重复列表无此产线下的工位,且此产线下无工位 if (maxSortId == null){ postStation.setSortId(0); }else { // 重复列表无此产线下的工位,但此产线下有工位 postStation.setSortId(maxSortId+1); } }
时间: 2024-03-16 07:46:05 浏览: 74
Test_if_icmpeq.rar_If...
这段代码的性能问题可能不在于循环方式,而是在于其中的一些操作。以下是几个可能需要优化的地方:
1. 在每次循环迭代中,都需要进行一次字符串比较,如果excelData.getStationNo()返回的字符串非常长,这会对性能产生影响。可以考虑将"".equals(stationCode)优化为stationCode.isEmpty(),这样可以避免创建一个空字符串对象。
2. 在使用stream进行过滤查找maxSortIdPojo时,可以考虑使用for循环代替,因为stream的创建和操作都会产生一定的开销。另外,如果sortIdList是有序的,可以使用二分查找算法来加速查找。
3. 在使用stream进行工位号比较时,可以考虑使用List.contains()方法代替anyMatch()方法,因为contains()方法的性能更高。
4. 在每次循环迭代中,都需要多次访问postStation对象的属性,这也会对性能产生影响。可以考虑将这些属性缓存在局部变量中,以减少访问次数。
5. 在多个if-else语句中,有些条件是可以合并的,以减少分支判断的次数。
优化后的代码可能如下所示(仅供参考):
```
stationCode = excelData.getStationNo();
if (stationCode.isEmpty()) {
errSet.add(ERR_STATION_CODE_NULL);
return;
}
if (relId != null) {
// 存入的excel表单中同一个产线下有重复的工位
stationCodes = stationCheckMap.get(relId);
maxSortId = null;
for (WorkShopLineSortIdPojo item : sortIdList) {
if (item.getRelId().equals(postStation.getRelId())) {
maxSortId = item.getMaxSortId();
break;
}
}
int size = stationCodes != null ? stationCodes.size() : 0;
if (size > 0 && stationCodes.contains(stationCode)) {
// excel表中重复工位号的产线相同
errSet.add(ERR_STATION_CODE_REPEAT);
return;
}
if (maxSortId == null) {
postStation.setSortId(size);
} else {
postStation.setSortId(maxSortId + size + 1);
}
} else {
// 重复列表无此产线下的工位,且此产线下无工位
postStation.setSortId(0);
}
// 处理其他属性
```
注意,这只是一种可能的优化方案,具体的实现和效果需要根据具体情况进行评估和调整。
阅读全文