记一次,iterator遍历数组的注意与使用

一个iterator遍历数组的注意使用

	前些天在项目中遇到了,感觉会忘记,特此记录一下。
	大家都知道数组list在遍历的过程中不能直接remove,要使用iterator,如图:
Iterator<ConsigneeAccountVo> iterator = list.iterator();
			while (iterator.hasNext()) {
				ConsigneeAccountVo next = iterator.next();
				if (next.getList().size() == 0) {        //这里是你可以自定义的要判断条件
					iterator.remove();
				}
			}

然后现在我在做一个“退款单”的需求,数据库中存在一个“退款工单表”和“退款单对应品表”,一个退款单可能对应多个退货商品,外键是退款工单的id,如图
在这里插入图片描述
在这里插入图片描述

某个订单在用户申请退款以后,如果这个订单里是一单多商品的订单,用户还能对该订单进行操作,当然操作的时候能退的商品只能选择没退货过的商品。在有一个全部商品的list的情况下,应该怎么从一堆商品里筛选掉已经被退款过的商品呢?
踩过坑,直接告诉你此处应该搭配for (int i = list.size(); i >0; i–) {逻辑}来写,而且是用-1倒着来遍历,不记得为啥得这样写了- - 贴代码~

// 遍历,筛掉已经申请过退款单的商品    orderItemModel就是需要遍历的商品集
			for (int i = orderItemModel.size(); i >0; i--) {
			//**注意点1**  构造对象的iterator
				Iterator<OrderItemModel> ite = orderItemModel.iterator();
				// 商品id  --此处(i-1),不然可能会数组越界
				Long goodsId = orderItemModel.get(i-1).getGoodsId();
				// 类型转换
				int gid = new Long(goodsId).intValue();
				// 一个单号可能对应存在多个退款单,重写一个dao,根据单号,拿到退款单集合
				List<RefundOrderModel> refundOrders = refundOrderDao.getRefundOrders(order.getExternalCode());
				// 如果list查到全是作废的单,上面会为空,直接返回   此处返回空交给前端处理即可
				if (CollectionUtils.isEmpty(refundOrders)){
					return orderItemModel;
				}
				// 有数据处理
				for (RefundOrderModel refundOrder : refundOrders) {
					Long rfid = refundOrder.getId();
					// 根据退款单id和商品id,看该工单这个品是否已经申请过退款
					RefundGoodsModel gmodel = refundGoodsDao.getByRefundIdAndGoodsId(rfid, gid);
					// 如果存在,那就去掉,不让用户选
					if (gmodel != null) {
					// 把ite中每一个对象和退款单中的商品id比较,看商品集合中,存不存id与“退款单对应品表”中找到的对象的商品id相同
						while (ite.hasNext()) {
							OrderItemModel next = ite.next();
							// 比较,有相同就删掉
							if (next.getGoodsId().equals(Long.valueOf(gid))) {
								ite.remove();
								// 一个“退款单对应品表”对象只对应一个品,既然已经找到了,免得浪费时间和资源,跳出最近的for循环,回到第二行直接进行下一次for循环
								break;
							}
						}
					}
				}
				// 集合里的元素如果都删完了,那就没了,返回空给前端处理,如果不加这个,在下次循环时会报错
				if (CollectionUtils.isEmpty(orderItemModel)) {
					return null;
				}

			}

就这样就能解决啦,不过感觉循环嵌套的还是有点多的,后续再看看能不能优化了。

注意:代码标注注意点处的构造对象的iterator,一定要在循环内new一个出来,确保每次都是新的iterator,不然他每next一次,指针就会指向下一位,会报越界,空指针,或者iterator专有的一个错,简单来说这是个“一次性”的东西,如果上面定义过全局的iterator,循环内记得要new一个新的来循环。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值