同一个Iterator 多次遍历遇到的坑

本次需求是因为jpa不支持动态sql拼接,我又懒得去在spring boot上面集成query dsl,所以采取删除list数组中不满足条件的数据

   开始

     String Code=null;  //我的业务需求代码
     String posiName=null; //我的业务需求代码

    List<JobApplyForm> jobApplyForms = new ArrayList<>(); 

//我将查询出来的数组放到我的list中。  JobApplyForm是我的实体,可以当作Object来理解。

    //新想到的逻辑实验一下
        
        Iterator<JobApplyForm> it = jobApplyForms.iterator();  //将list类型的转为Iterator,
        while(it.hasNext()){   //判断是否有下一个元素,已下角标为准,并且每读过一个下角标都会记录,当读到最后一个下角标时会返回null
            JobApplyForm x = it.next(); //我获取的是我的实体,
            if(Code !=null) {
            if(!x.getCode().equals(Code)){  //进行逻辑判断
                it.remove();  //进行删除,此处需要说明,这里的删除实际映射的地址是jobApplyForms 这个的地址,也就是说当执行将list类型的转为Iterator这个操作的时候,不是赋值,是等值的关系,it中删除的元素,在jobApplyForms这个list中也会删除。
            }
            }
           
        }

//假设上面的数据总数是五条,满足逻辑的条件只有三条,那么删除两条,当执行完上述的代码后。it中会显示三条数据,jobApplyForms也会显示三条数据,
        it = jobApplyForms.iterator();  //需要重新初始化Collection的iterator()。PS:如果没有这一行,就会出现无法遍历it的情况,原因是,关于it这迭代器,你已经读到最后一位了。下一位没有了,你要是向重新读一遍,就需要初始化一次迭代器。
        while(it.hasNext()){
            JobApplyForm x = it.next();
            if(null !=posiName) {
                if(!x.getPosition().equals(posiName)){
                    it.remove();
                }
            }
        }
        it = jobApplyForms.iterator();  //再一次的初始化遍历器。
        List<JobApplyForm> myList=IteratorUtils.toList(it);  //使用Apache Common Collections  将Iterator<JobApplyForm> 转为List<JobApplyForm>

 

 

上述的例子只是为了讲解一下Iterator 多次遍历需要进行初始化,如果你遇到了jpa无法动态拼接sql的情况,而实际需求又需要大量动态拼接sql。个人建议马上集成query dsl,别学我通过删除list来达到多条件查询的目的。这不是好办法!

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值