簡體   English   中英

Hashmap接收true而不是ArrayList

[英]Hashmap receives true instead of ArrayList

因此,事實證明我在工作(我還不是高級開發人員),但突然我意識到我的代碼有問題。 Hashmap接收“ true”,而不是接收在其第一個位置具有一個對象的ArrayList。 作為示例,您可以看到我在說什么,如下所示:

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

經過某些代碼行和對helperMethods的編碼后,我試圖從地圖中檢索該“ 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);

為了減少創建列表並將對象設置為列表的那兩行代碼,可以采取什么措施? 當然這沒什么大不了的,只是我想使我的編碼更清晰,更直觀。

您可以像這樣使用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"));

您可以使用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);

另一種方法是使用雙括號初始化語法:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM