有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Hashmap接收true而不是ArrayList

结果证明我在工作(正如你所看到的,我还不是高级开发人员),突然意识到我的代码出了问题。Hashmap接收“true”,而不是接收第一个位置有一个对象的ArrayList。作为一个例子,你可以看到我所说的如下:

    Product item = new Product(); 
    Map rMap = new HashMap();        
    rMap.put("productsList", new ArrayList().add(item));

在特定的代码行和编码帮助方法之后,我试图从地图中检索“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);

为了减少创建列表并将对象设置到列表中的这两行代码,可以做些什么?这当然没什么大不了的,只是我想让我的编码更清晰、更稳重


共 (3) 个答案

  1. # 1 楼答案

    另一种方法是使用double brace initialization语法:

    rMap.put("productsList", new ArrayList() {{ add(item); /*may be other code*/ }});
    

    但它有一些副作用(编译器需要生成一个附加类)

    开始你的问题。按照设计,标准Java集合类没有修改集合并返回修改过的对象的方法(比如^{)。所以这个初始化非常干净:

    List<Product> myList = new ArrayList();
    myList.add(item);
    rMap.put("productsList", myList);
    
  2. # 2 楼答案

    您可以使用Arrays#asList而不是new ArrayList().add(item),但是它会返回一个固定大小的列表,而这可能不是您想要的

    另一种方法是像这样使用^{}来创建并添加一个您想要映射的类型的新列表,然后在返回时将该项添加到列表中

    Product item = new Product(); 
    Map<String, List<Product>> rMap = new HashMap<>();        
    rMap.computeIfAbsent("key", s -> new ArrayList<>()).add(item);
    
  3. # 3 楼答案

    你可以像这样使用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"));