我是靠谱客的博主 清脆烧鹅,最近开发中收集的这篇文章主要介绍记一次,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一个新的来循环。

最后

以上就是清脆烧鹅为你收集整理的记一次,iterator遍历数组的注意与使用的全部内容,希望文章能够帮你解决记一次,iterator遍历数组的注意与使用所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(42)

评论列表共有 0 条评论

立即
投稿
返回
顶部