Hashmap接收true而不是ArrayList

时间:2014-10-12 22:45:26

标签: java arraylist constructor

事实证明我正在工作(我现在还不是高级开发人员,你可以看到),而我突然意识到我的代码出了问题。 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设置为列表的那两行代码,可以做些什么?当然,这不是什么大不了的事,只是我想让我的编码更清晰,更明确。

3 个答案:

答案 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);