杰瑞科技汇

Java Map转List有哪些常用方法?

  1. 只包含所有的键
  2. 只包含所有的值
  3. 包含所有的键值对

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

Java Map转List有哪些常用方法?-图1
(图片来源网络,侵删)

准备工作:一个示例 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 并遍历 MapentrySet

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(...) 循环 + 手动转换

核心要点:

  1. Java 8+ 的 Stream API 是最简洁、最现代、功能最强大的方式,强烈推荐使用。
  2. Map.keySet(), Map.values(), Map.entrySet() 分别用于获取键、值和键值对的集合视图。
  3. 对于简单的 List 创建,可以直接使用 new ArrayList<>(map.keySet()) 这样的构造方法,它内部会自动完成遍历和添加,比手动 for 循环更简洁。
  4. 当需要将键值对转换成其他对象时,Streammap() 方法是最佳选择。
分享:
扫描分享到社交APP
上一篇
下一篇