迭代一组对象并将其存储到列表中

时间:2016-09-03 08:25:08

标签: java

有人可以帮助..

如何迭代此设置并将其存储到列表中。我变空了。

public class CartView {

    public void getCartProductsDetail(HttpServletRequest request, 
                                      HttpServletResponse response){
        List<Product> productsList=null;
        try {
            Map<Long,Integer> cart=SessionManager.getSession(request);
            Set<Long> products=cart.keySet();
            for(long productId: products){
                productsList.add(ProductDAO.getProductDetails(productId));
            }
            request.setAttribute("productsList", productsList);
            RequestDispatcher dispatcher = request
                .getRequestDispatcher(NavigationFiles.VIEW_CART);
            dispatcher.forward(request, response);
        } catch(Exception e){
            e.printStackTrace();
        }
    }

}

感谢您的帮助。

1 个答案:

答案 0 :(得分:4)

  

如何迭代此集并将其存储到列表中。我变空了。

您忘记初始化变量productsList,当您调用null方法时,它仍为add,这就是您收到错误的原因,如下所示:

List<Product> productsList=null;

当您使用Java 8时,您可以依靠Stream API来执行此操作:

List<Product> productsList = cart.keySet()
    .stream()
    .map(ProductDAO::getProductDetails)
    .collect(Collectors.toList());

或者只是使用ArrayList初始化您的变量,例如:

// Initialize the size of the array list with the size of products
// as it will be its final size which is faster than using the default
// constructor
productsList = new ArrayList<>(products.size());

响应更新:

由于您的方法ProductDAO.getProductDetails(long)会引发checked exception,因此基于Stream API的当前代码无法正常工作,因为地图方法不支持Function抛出checked exceptions

您有2种方法可以解决它:

创建另一个将checked exceptions包装到unchecked exception并抛出此新异常的方法,然后您就可以将此新方法用作map方法提供的函数。

类似的东西:

public static Product getProductDetailsSilently(long val) {
    try {
        return ProductDAO.getProductDetails(val);
    } catch (Exception e) {
        throw new IllegalStateException(e);
    }
}

允许创建List Product的代码将是:

List<Product> productsList = cart.keySet()
    .stream()
    .map(ProductDAO::getProductDetailsSilently)
    .collect(Collectors.toList());

或依靠lambda expression做同样的事情,但在map方法中做下一步:

List<Product> productsList = cart.keySet()
    .stream()
    .map(val -> {
        try {
            return ProductDAO.getProductDetails(val);
        } catch (Exception e) {
            throw new IllegalStateException(e);
        } 
    })
    .collect(Collectors.toList());