Java 为什么迭代只对列表进行一次迭代?

Java 为什么迭代只对列表进行一次迭代?,java,iterator,Java,Iterator,我有一个名为ProductBean的Bean,还有两个包含产品id和产品大小的列表。我试图根据id获取产品尺寸,该id工作正常,但列表包含两项,并且仅给出第一项的结果。我在下面尝试的代码是- Iterator itr = cart.iterator(); while (itr.hasNext()) { Integer i = (Integer) itr.next(); LOG.info("Poduct Id " + i); CriteriaBuilder buil

我有一个名为ProductBean的Bean,还有两个包含产品id和产品大小的列表。我试图根据id获取产品尺寸,该id工作正常,但列表包含两项,并且仅给出第一项的结果。我在下面尝试的代码是-

Iterator itr = cart.iterator();
while (itr.hasNext()) {
    Integer i = (Integer) itr.next();    
    LOG.info("Poduct Id " + i);
    CriteriaBuilder builder = session.getCriteriaBuilder();
    CriteriaQuery<ProductBean> citeriaQuery = builder.createQuery(ProductBean.class);
    Root<ProductBean> root = citeriaQuery.from(ProductBean.class);
    citeriaQuery.select(root);
    citeriaQuery.where(builder.equal(root.get("product_id"), i));
    Query<ProductBean> query = session.createQuery(citeriaQuery);
    productBeanList = query.list();                
    for (ProductBean productBean : productBeanList) {
        StringBuilder sb = new StringBuilder();
        sb.append(productBean.getProduct_size());
        String[] lines = sb.toString().split(", ");                    
        for (String s : lines) {                       
            itr = sizes.iterator();
            while (itr.hasNext()) {
                Object size = (Object) itr.next();                            
                if (String.valueOf(size).equals(s)) {
                    LOG.info("If condition matches " + String.valueOf(size) + " id is " + i);
                    productMap = new HashMap();
                    productMap.put("productBeanSize", String.valueOf(size));
                    productMap.put("productBean", productBean);
                    productList.add(productMap);
                }
            }
        }
    }
}
Iterator itr=cart.Iterator();
while(itr.hasNext()){
整数i=(整数)itr.next();
日志信息(“Poduct Id”+i);
CriteriaBuilder=session.getCriteriaBuilder();
CriteriaQuery citeriaQuery=builder.createQuery(ProductBean.class);
Root=citeriaQuery.from(ProductBean.class);
citeriaQuery.select(root);
其中(builder.equal(root.get(“product_id”),i));
Query Query=session.createQuery(citeriaQuery);
productBeanList=query.list();
for(ProductBean ProductBean:productBeanList){
StringBuilder sb=新的StringBuilder();
sb.append(productBean.getProduct_size());
字符串[]行=sb.toString().split(“,”);
对于(字符串s:行){
itr=大小。迭代器();
while(itr.hasNext()){
对象大小=(对象)itr.next();
if(String.valueOf(size).equals){
LOG.info(“如果条件匹配”+String.valueOf(size)+“id为”+i);
productMap=newhashmap();
productMap.put(“productBeanSize”,String.valueOf(size));
productMap.put(“productBean”,productBean);
productList.add(productMap);
}
}
}
}
}

在内部
for
循环中,您正在以令人困惑的方式重新分配
迭代器itr

在内部
while
循环精细化之后,
itr
完成并且没有更多的元素,因此
itr.hasNext()
在外部
while
中也是
false
,因为它是这里提供的所有代码都可见的相同的变量

最好在内部循环中创建一个新的范围更广的迭代器变量:

// renamed itr to cartItr
// added final modifier to prevent re assignment.
final Iterator cartItr = cart.iterator();
while (cartItr.hasNext()) {
    Integer i = (Integer) cartItr.next();    
    LOG.info("Poduct Id " + i);
    CriteriaBuilder builder = session.getCriteriaBuilder();
    CriteriaQuery<ProductBean> citeriaQuery = builder.createQuery(ProductBean.class);
    Root<ProductBean> root = citeriaQuery.from(ProductBean.class);
    citeriaQuery.select(root);
    citeriaQuery.where(builder.equal(root.get("product_id"), i));
    Query<ProductBean> query = session.createQuery(citeriaQuery);
    productBeanList = query.list();                
    for (ProductBean productBean : productBeanList) {
        StringBuilder sb = new StringBuilder();
        sb.append(productBean.getProduct_size());
        String[] lines = sb.toString().split(", ");                    
        for (String s : lines) {                       
            // added extra iterator variable sizesItr only visible in this for-block.
            // added final modifier to prevent re assignment.
            final Iterator sizesItr = sizes.iterator();
            while (sizesItr.hasNext()) {
                Object size = (Object) sizesItr.next();                            
                if (String.valueOf(size).equals(s)) {
                    LOG.info("If condition matches " + String.valueOf(size) + " id is " + i);
                    productMap = new HashMap();
                    productMap.put("productBeanSize", String.valueOf(size));
                    productMap.put("productBean", productBean);
                    productList.add(productMap);
                }
            }
        }
    }
}
//将itr重命名为cartItr
//添加了最终修改器以防止重新指定。
final Iterator cartItr=cart.Iterator();
while(cartItr.hasNext()){
整数i=(整数)cartItr.next();
日志信息(“Poduct Id”+i);
CriteriaBuilder=session.getCriteriaBuilder();
CriteriaQuery citeriaQuery=builder.createQuery(ProductBean.class);
Root=citeriaQuery.from(ProductBean.class);
citeriaQuery.select(root);
其中(builder.equal(root.get(“product_id”),i));
Query Query=session.createQuery(citeriaQuery);
productBeanList=query.list();
for(ProductBean ProductBean:productBeanList){
StringBuilder sb=新的StringBuilder();
sb.append(productBean.getProduct_size());
字符串[]行=sb.toString().split(“,”);
对于(字符串s:行){
//添加的额外迭代器变量SIZESTR仅在此for块中可见。
//添加了最终修改器以防止重新指定。
final Iterator sizesItr=size.Iterator();
while(sizesItr.hasNext()){
对象大小=(对象)sizeistr.next();
if(String.valueOf(size).equals){
LOG.info(“如果条件匹配”+String.valueOf(size)+“id为”+i);
productMap=newhashmap();
productMap.put(“productBeanSize”,String.valueOf(size));
productMap.put(“productBean”,productBean);
productList.add(productMap);
}
}
}
}
}

如果您有新问题,请单击按钮提问。如果此问题有助于提供上下文,请包含指向此问题的链接。