1. 概述

本文将演示如何使用纯JavaGuava库将Map的值转换为Array、List或Set。这些都是日常开发中高频操作,掌握后能显著提升编码效率。

✅ 核心要点:

  • 所有转换均可单行完成
  • 兼容Java标准库和Guava两种实现
  • 代码示例可直接用于生产环境

2. Map值转Array

使用纯Java实现Map值转数组:

@Test
public void givenUsingCoreJava_whenMapValuesConvertedToArray_thenCorrect() {
    Map<Integer, String> sourceMap = createMap();

    Collection<String> values = sourceMap.values();
    String[] targetArray = values.toArray(new String[0]);
}

⚠️ 重点注意:

  • 优先使用toArray(new T[0])而非toArray(new T[size])
  • 前者性能更优(参考Aleksey Shipilëv的基准测试
  • 且能避免潜在的类型安全问题

3. Map值转List

3.1 纯Java实现

@Test
public void givenUsingCoreJava_whenMapValuesConvertedToList_thenCorrect() {
    Map<Integer, String> sourceMap = createMap();

    List<String> targetList = new ArrayList<>(sourceMap.values());
}

3.2 Guava实现

@Test
public void givenUsingGuava_whenMapValuesConvertedToList_thenCorrect() {
    Map<Integer, String> sourceMap = createMap();

    List<String> targetList = Lists.newArrayList(sourceMap.values());
}

✅ 对比建议:

  • 纯Java方案:零依赖,适合基础项目
  • Guava方案:代码更简洁,适合已引入Guava的项目

4. Map值转Set

使用纯Java实现Map值转Set:

@Test
public void givenUsingCoreJava_whenMapValuesConvertedToSet_thenCorrect() {
    Map<Integer, String> sourceMap = createMap();

    Set<String> targetSet = new HashSet<>(sourceMap.values());
}

❌ 常见误区:

  • 直接使用sourceMap.values()返回的是Collection,不是Set
  • 需显式构造HashSet/TreeSet等具体实现类

5. 总结

所有转换操作的核心技巧:

  1. 通过map.values()获取值集合
  2. 利用目标类型的构造器或工厂方法完成转换
  3. 优先选择零依赖的纯Java方案

📌 完整示例代码见GitHub项目(Maven项目,可直接导入运行)


原始标题:Convert a Map to an Array, List or Set in Java | Baeldung