- 只包含所有的键
- 只包含所有的值
- 包含所有的键值对
下面我将分别详细介绍这三种情况的实现方法,并提供从 Java 8 开始的现代写法和传统的写法,以便你了解不同版本 Java 的差异。

准备工作:一个示例 Map
我们先创建一个示例 Map,方便后续演示:
import java.util.HashMap;
import java.util.Map;
public class MapToListExample {
public static void main(String[] args) {
// 准备一个 Map
Map<String, Integer> map = new HashMap<>();
map.put("apple", 10);
map.put("banana", 20);
map.put("orange", 30);
}
}
将 Map 的键 转换为 List
目标是将 Map 中的所有 key(如 "apple", "banana", "orange")放入一个 List 中。
方法 1:Java 8+ 现代写法 (推荐)
使用 Map.keySet() 方法获取所有键的 Set 集合,然后利用 Stream API 的 collect() 方法将其转换为 List。
// 使用 Stream API
List<String> keyList = map.keySet().stream()
.collect(Collectors.toList());
System.out.println(keyList); // 输出: [orange, banana, apple] (顺序可能不同)
方法 2:传统写法 (Java 8 之前)
手动创建一个新的 ArrayList,然后遍历 Map 的键集合,逐个添加到 List 中。
// 传统方式
List<String> keyList = new ArrayList<>();
for (String key : map.keySet()) {
keyList.add(key);
}
System.out.println(keyList); // 输出: [orange, banana, apple] (顺序可能不同)
将 Map 的值 转换为 List
目标是将 Map 中的所有 value(如 10, 20, 30)放入一个 List 中。
方法 1:Java 8+ 现代写法 (推荐)
使用 Map.values() 方法获取所有值的 Collection 集合,然后使用 Stream API 进行转换。
// 使用 Stream API
List<Integer> valueList = map.values().stream()
.collect(Collectors.toList());
System.out.println(valueList); // 输出: [30, 20, 10] (顺序可能不同)
方法 2:传统写法 (Java 8 之前)
同样,手动创建 ArrayList 并遍历 Map 的值集合。
// 传统方式
List<Integer> valueList = new ArrayList<>();
for (Integer value : map.values()) {
valueList.add(value);
}
System.out.println(valueList); // 输出: [30, 20, 10] (顺序可能不同)
将 Map 的键值对 转换为 List
这种情况稍微复杂一些,因为 Map 中的键值对在 Java 中被表示为 Map.Entry 对象,目标是将所有的 Map.Entry 对象放入一个 List 中。
方法 1:Java 8+ 现代写法 (推荐)
使用 Map.entrySet() 方法获取所有键值对的 Set 集合,然后使用 Stream API 进行转换。
import java.util.Map.Entry;
// 使用 Stream API
List<Entry<String, Integer>> entryList = map.entrySet().stream()
.collect(Collectors.toList());
// 打印结果以验证
entryList.forEach(entry -> System.out.println(entry.getKey() + ": " + entry.getValue()));
// 输出可能如下 (顺序可能不同):
// orange: 30
// banana: 20
// apple: 10
方法 2:传统写法 (Java 8 之前)
手动创建 ArrayList 并遍历 Map 的 entrySet。
import java.util.Map.Entry;
// 传统方式
List<Entry<String, Integer>> entryList = new ArrayList<>();
for (Entry<String, Integer> entry : map.entrySet()) {
entryList.add(entry);
}
// 打印结果以验证
for (Entry<String, Integer> entry : entryList) {
System.out.println(entry.getKey() + ": " + entry.getValue());
}
// 输出可能如下 (顺序可能不同):
// orange: 30
// banana: 20
// apple: 10
高级用法:将 Map 转换为特定对象的 List
有时,我们不想存储 Map.Entry,而是想将其转换为一个自定义的 DTO (Data Transfer Object) 或 POJO (Plain Old Java Object) 的 List。
我们有一个 Fruit 类:
class Fruit {
private String name;
private int quantity;
// 构造函数, getter, setter, toString() 方法
public Fruit(String name, int quantity) {
this.name = name;
this.quantity = quantity;
}
public String getName() {
return name;
}
public int getQuantity() {
return quantity;
}
@Override
public String toString() {
return "Fruit{name='" + name + "', quantity=" + quantity + "}";
}
}
我们想将 Map<String, Integer> 转换为 List<Fruit>。
Java 8+ 现代写法 (使用 map 操作)
这非常优雅,可以在 collect 之前使用 map 操作来转换每个 Map.Entry。
List<Fruit> fruitList = map.entrySet().stream()
.map(entry -> new Fruit(entry.getKey(), entry.getValue())) // 将每个 Entry 转换为 Fruit 对象
.collect(Collectors.toList());
System.out.println(fruitList);
// 输出可能如下 (顺序可能不同):
// [Fruit{name='orange', quantity=30}, Fruit{name='banana', quantity=20}, Fruit{name='apple', quantity=10}]
传统写法 (Java 8 之前)
需要手动进行对象转换。
List<Fruit> fruitList = new ArrayList<>();
for (Map.Entry<String, Integer> entry : map.entrySet()) {
fruitList.add(new Fruit(entry.getKey(), entry.getValue()));
}
System.out.println(fruitList);
// 输出可能如下 (顺序可能不同):
// [Fruit{name='orange', quantity=30}, Fruit{name='banana', quantity=20}, Fruit{name='apple', quantity=10}]
| 转换目标 | Java 8+ 写法 (推荐) | 传统写法 (Java 8-) |
|---|---|---|
键 -> List |
map.keySet().stream().collect(Collectors.toList()) |
new ArrayList<>(map.keySet()) (直接构造) 或循环添加 |
值 -> List |
map.values().stream().collect(Collectors.toList()) |
new ArrayList<>(map.values()) (直接构造) 或循环添加 |
键值对 -> List<Map.Entry> |
map.entrySet().stream().collect(Collectors.toList()) |
new ArrayList<>(map.entrySet()) (直接构造) 或循环添加 |
自定义对象 -> List |
map.entrySet().stream().map(entry -> new ...()).collect(...) |
循环 + 手动转换 |
核心要点:
- Java 8+ 的
StreamAPI 是最简洁、最现代、功能最强大的方式,强烈推荐使用。 Map.keySet(),Map.values(),Map.entrySet()分别用于获取键、值和键值对的集合视图。- 对于简单的
List创建,可以直接使用new ArrayList<>(map.keySet())这样的构造方法,它内部会自动完成遍历和添加,比手动for循环更简洁。 - 当需要将键值对转换成其他对象时,
Stream的map()方法是最佳选择。
