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

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

   开始

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

    List jobApplyForms = new ArrayList<>(); 

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

    //新想到的逻辑实验一下
        
        Iterator 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 myList=IteratorUtils.toList(it);  //使用Apache Common Collections  将Iterator 转为List

 

 

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

 

你可能感兴趣的:(同一个Iterator 多次遍历遇到的坑)