2016-02-13 130 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