2016-05-13 49 views
-1

在我的初學者方法中,我確保兩個ArrayList具有相同的大小,否則我會拋出一個異常。我用來迭代兩個ArrayLists並將鍵值對放入地圖的解決方案可以正常工作,但我也發現它不是很優雅或最新。迭代兩個ArrayList並將鍵值映射得更加優雅

在這種方法中,我正在填充一張將隨後與Apache freemarker庫一起使用的映射。

Map<String, Object> map = new HashMap<String, Object>(); 

String placeHolder; 
String value; 
for (int i = 0; i < placeHolderList.size(); i++) { 
    placeHolder = placeHolderList.get(i); 
    value = valueList.get(i); 

    map.put(placeHolder, value); 
} 

什麼是在Java 8中做到這一點更優雅和高效的方法?

+3

不要聲明'字符串佔位符;'和'字符串值;'了'for'循環之前。使用Stream API,沒有真正優雅的解決方案,只需在索引和'toMap'收集器上使用'IntStream'。請參閱Oracle教程https://docs.oracle.com/javase/tutorial/collections/streams/。 – Tunaki

回答

3

像這樣的事情可以做的伎倆:

List<String> placeHolderList = Arrays.asList("key1", "key2"); 
List<Object> valueList = Arrays.asList("value1", "value2"); 

Map<String, Object> result = IntStream.range(0, placeHolderList.size()) 
    .boxed() 
    .collect(toMap(placeHolderList::get, valueList::get)); 

System.out.println(result); 

輸出:

{key1=value1, key2=value2} 
+0

謝謝!您和@ HankD的解決方案非常有用 – DavideS

1

正如@NicolasFilotto answer說你需要遍歷索引,但沒有必要框中指數本身。

Map<String, Object> result = IntStream.range(0, placeHolderList.size()) 
           .collect(HashMap::new, 
           (map, i) -> map.put(placeHolderList.get(i), valueList.get(i)), 
           Map::putAll); 
0

如果你不使用Java 8那就試試這個:

List<String> keyList = Arrays.asList("1", "2"); 
    List<String> valList = Arrays.asList("one", "two"); 

    Map<String, String> map = new HashMap<String, String>(); 

    for (int i = 0; i < keyList.size(); i++) { 
     map.put(keyList.get(i), valList.get(i)); 
    } 
    System.out.println(map);