转换列表<map.entry <key,value =“”>&gt;在Java中列出<key>

时间:2016-01-13 21:08:42

标签: java dictionary hashmap

除了for循环之外,还有一种方便的方式进行此类转换,例如

List<Map.Entry<String, Integer>> entryList = new List<>(//initialization);
List<String>> keyList = new List<>(entryList.size());
for (Map.Entry<String, Integer> e : entryList) {
    keyList.add(e.getKey());
}

我希望保留订单。

2 个答案:

答案 0 :(得分:18)

使用java 8流转换它:

List<Map.Entry<String, ?>> entryList = new List<>(//initialization);
List<String> stringList = entryList.stream().map(Entry::getKey).collect(Collectors.toList());

这会生成stream个条目,然后使用map方法将它们转换为字符串,然后使用Collectors.toList()将其收集到列表中。

或者,如果您需要更多次,可以在辅助函数中更改此方法:

public static <K> List<K> getKeys(List<Map.Entry<K,?>> entryList) {
    return entryList.stream().map(Entry::getKey).collect(Collectors.toList());
}

public static <V> List<V> getValues(List<Map.Entry<?,V>> entryList) {
    return entryList.stream().map(Entry::getValue).collect(Collectors.toList());
}

虽然上述代码有效,但您也可以通过List<K>从地图中获取new ArrayList<>(map.keySet()),这样做的好处就在于您不需要将entryset转换为一个列表,在转换为流之前,然后再次返回列表。

答案 1 :(得分:1)

如果你真的不需要制作列表的副本,你可以像这样在列表周围实现一个包装器,使用adicional奖励,对entryList所做的更改会自动反映在stringList中。请记住,这个简单的包装器是只读的。

List<Map.Entry<String, ?>> entryList = new List<>(//initialization);
List<String> stringList = new AbstractList<String>() {
    List<Map.Entry<String, Integer>> internal = entryList;

    public String get(int index) {
        return internal.get(index).getKey();
    }

    public int size() {
        return internal.size();
    }
};