事实证明我正在工作(我现在还不是高级开发人员,你可以看到),而我突然意识到我的代码出了问题。 Hashmap接收“true”而不是接收具有第一个位置中的一个对象的ArrayList。作为一个例子,你可以看到我正在谈论的内容如下:
Product item = new Product();
Map rMap = new HashMap();
rMap.put("productsList", new ArrayList().add(item));
在某些代码行和编码helperMethod之后,我试图从地图中检索出“productsList”,但我不能这样做,我不知道为什么在调试之后我发现当PUT完成时,没有这样的列表,只是一个布尔值。我检索它的方式如下:
if (rMap.containsKey("productsList")) {
// This IF statement was being skipped because of the Boolean
if (rMap.get("productsList") instanceof ArrayList) {
List<Product> pr = (List) rMap.get("productsList");
}
}
另一方面,我已经得到了这个(这更清楚了)并按预期进行了炒作:
Product item = new Product();
Map rMap = new HashMap();
List < Product > myList = new ArrayList();
myList.add(item);
rMap.put("productsList", myList);
为了减少创建List并将Object设置为列表的那两行代码,可以做些什么?当然,这不是什么大不了的事,只是我想让我的编码更清晰,更明确。
答案 0 :(得分:2)
您可以使用Arrays#asList这样的方法
map.put("productList", Arrays.asList(item1, item2, item3));
此外,我建议您使用泛型,您将获得类型安全性作为交换。
Map<String, List<String>> rMap = new HashMap<String, List<String>>();
rMapu.put("productList", Arrays.asList("item1", "item2"));
答案 1 :(得分:1)
您可以使用Arrays#asList
代替new ArrayList().add(item)
,但是会返回一个固定大小的列表,可能不是您想要的。
另一种方法是使用这样的Map#computeIfAbsent
创建并向地图添加所需类型的新列表,然后在返回时将该项添加到列表中。
Product item = new Product();
Map<String, List<Product>> rMap = new HashMap<>();
rMap.computeIfAbsent("key", s -> new ArrayList<>()).add(item);
答案 2 :(得分:1)
另一种方法是使用double brace initialization语法:
rMap.put("productsList", new ArrayList() {{ add(item); /*may be other code*/ }});
但它有一些副作用(编译器需要另外一个类)。
开始提问。按照设计,标准Java集合类没有修改集合和返回修改对象的方法(如StringBuilder.append
)。所以这个初始化非常简洁:
List<Product> myList = new ArrayList();
myList.add(item);
rMap.put("productsList", myList);