为什么要迭代一次列表呢?

时间:2019-01-30 07:40:51

标签: java iterator

我有一个名为ProductBean的Bean,还有两个包含产品ID和产品尺寸的列表。 Iam试图根据ID来获得产品尺寸,该ID可以正常工作,但list包含两个项目,并且仅给出第一个项目的结果。我在下面尝试过的代码是-

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);
                }
            }
        }
    }
}

1 个答案:

答案 0 :(得分:3)

您正在以混乱的方式在内部Iterator itr中重新分配for

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

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

// 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);
                }
            }
        }
    }
}
相关问题