有人可以帮助..
如何迭代此设置并将其存储到列表中。我变空了。
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();
}
}
}
感谢您的帮助。
答案 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());