2016-02-13 124 views
3

我想從現有的HashMapkeyset()中創建一個新映射,該映射將密鑰映射到其映射中的索引。Java 8.習慣用法從鍵集創建索引映射?

這裏是我的嘗試,它的工作原理:

Map<String, Integer> keysToIndex = new HashMap<>(); 
Integer index = 0; 
for (String obj: hashMap.keySet()) { 
    keysToIndex.put(obj, index); 
    index += 1; 
} 

確實的Java 8提供的功能來創建一個映射每個鍵的索引,或者是有寫這個片段更習慣的方法?

+0

參見http://stackoverflow.com/questions/:

順便提及,可以通過直接使用forEach()源地圖上(並忽略BiConsumer的值參數)丟棄一個多個方法調用17640754/zipping-streams-using-jdk8-with-lambda -java-util-stream-streams-zip –

+0

檢查此[此答案](http://stackoverflow.com/a/32864029/4856258)和其他答案題。 –

回答

3

集合沒有排序,所以集合中元素的「索引」是任意的(儘管是唯一的)。該「指數」僅僅是地圖的電流的大小,所以你可以使用結果地圖的國家提供索引:

Map<String, Integer> keysToIndex = new HashMap<>(); 
hashMap.keySet().forEach(k -> keysToIndex.put(k, keysToIndex.size())); 

這或多或少是你的代碼是幹什麼的,但由於沒有額外的更緊湊變量或指令是必需的。

Map<String, Integer> keysToIndex = new HashMap<>(); 
hashMap.forEach((k, v) -> keysToIndex.put(k, keysToIndex.size())); 
+0

謝謝!我喜歡這兩個電話。順便說一句,'V'在第二個是未使用的。是否有任何約定來表示像'_'這樣的未使用的變量?顯然,當我嘗試時我不能使用'_'。 –

+0

@SenthilKumaran我想知道同樣的事情,也想過使用'_'(與其他語言一樣),但['_'是禁止的!](http://stackoverflow.com/questions/34521690/why-is-一個單下劃線字符的非法名稱-FOR-A-λ-參數)。我使用「忽略」或根本不打擾電報不使用。 – Bohemian

+0

@波希米亞:'_'標識符是被禁止的,因爲它可能成爲未來Java版本中未使用參數的佔位符。在此之前,沒有人會阻止你使用'__'作爲標識符... – Holger