除了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());
}
我希望保留订单。
答案 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();
}
};