仅记录一下日常工作中出现的问题 源代码如下:
public int getOrderOverdueDay(MallOrder mallOrder) {
// 业务代码 移除
return calcMaxOverdueDay(Collections.singletonList(mallOrder));
}
public int calcMaxOverdueDay(List<MallOrder> mallOrders) {
// 业务代码 移除
int maxOverdueDay = 0;
// 入参有地方使用的是Collections.singletonList 创建的List是内部的List,用到remove方法会报错
Iterator<MallOrder> iterator = mallOrders.iterator();
while (iterator.hasNext()) {
MallOrder element = iterator.next();
MallOrderSellPayType sellPayType = xx(element.getOrderCode());
if (sellPayType == null) {
log.warn("sellPayType表数据没创建:{}", element.getOrderCode());
iterator.remove();
continue;
}
if (sellPayType.getSellPayType() != 0) {
iterator.remove();
continue;
}
if (sellPayType.getIsTransfer() == 2) {
// 业务代码移除
boolean inStore = xx(element.getOrderCode());
if (inStore) {
iterator.remove();
}
}
}
}
iterator.remove();方法会抛出UnsupportedOperationException异常,是因为Collections.singletonList(mallOrder)生成的List是Collections的内部类 java.util.Collections.SingletonList,没有实现remove方法导致的。
解决的方案有在入参时改掉List的类型,或者在调用迭代器的时候重新new一个ArrayList 如下:
public int calcMaxOverdueDay(List<MallOrder> mallOrders) {
// **
// 重要代码
Iterator<MallOrder> iterator = new ArrayList<>(mallOrders).iterator();
// **
}
遇到一个问题,mallOrder的循环里面没有被处理,所以需要改一下引用
public int calcMaxOverdueDay(List<MallOrder> mallOrders) {
// **
// 重要代码
mallOrders = new ArrayList<>(mallOrders);
Iterator<MallOrder> iterator = mallOrders.iterator();
// **
}