一键转换,极速掌握Map和List数据转换大法!
2023-06-09 01:31:24
在 Java 中轻松转换 List 和 Map
在 Java 编程中,我们经常需要在 List 和 Map 数据结构之间转换。这些转换对于数据处理、排序、过滤和聚合等任务非常有用。本文将详细介绍 Java 中常用的 List 转 Map 和 Map 转 List 的方法,并附有实例演示,帮助你轻松掌握这些转换技巧。
List 转 Map
利用 HashMap 的 put() 方法
List<String> names = Arrays.asList("John", "Mary", "Bob");
Map<String, Integer> nameMap = new HashMap<>();
for (int i = 0; i < names.size(); i++) {
nameMap.put(names.get(i), i);
}
System.out.println(nameMap); // 输出:{John=0, Mary=1, Bob=2}
此方法直接使用 HashMap 的 put() 方法将 List 中的元素作为键值对添加到 Map 中。它适用于需要自定义键和值的情况。
使用 Collectors.toMap() 方法
List<String> names = Arrays.asList("John", "Mary", "Bob");
Map<String, Integer> nameMap = names.stream()
.collect(Collectors.toMap(Function.identity(), String::length));
System.out.println(nameMap); // 输出:{John=4, Mary=4, Bob=3}
Collectors.toMap() 方法提供了一个更简洁的方式来转换 List。它接收两个参数:一个函数来提取键,另一个函数来提取值。此例中,我们提取了每个字符串的长度作为值。
使用 Apache Commons Collections 库
List<String> names = Arrays.asList("John", "Mary", "Bob");
Map<String, Integer> nameMap = ListUtils.toMap(names, String::length);
System.out.println(nameMap); // 输出:{John=4, Mary=4, Bob=3}
Apache Commons Collections 库提供了 ListUtils.toMap() 方法,它也支持类似于 Collectors.toMap() 的转换功能。
Map 转 List
利用 entrySet() 和 stream() 方法
Map<String, Integer> nameMap = new HashMap<>();
nameMap.put("John", 25);
nameMap.put("Mary", 30);
nameMap.put("Bob", 28);
List<Map.Entry<String, Integer>> nameList = new ArrayList<>(nameMap.entrySet());
List<String> names = nameList.stream()
.map(Map.Entry::getKey)
.collect(Collectors.toList());
System.out.println(names); // 输出:[John, Mary, Bob]
此方法使用 entrySet() 方法获取 Map 中的所有键值对,然后使用 stream() 和 map() 方法将其转换为 List。
利用 keySet() 和 stream() 方法
Map<String, Integer> nameMap = new HashMap<>();
nameMap.put("John", 25);
nameMap.put("Mary", 30);
nameMap.put("Bob", 28);
List<String> names = new ArrayList<>(nameMap.keySet());
System.out.println(names); // 输出:[John, Mary, Bob]
此方法使用 keySet() 方法获取 Map 中的所有键,然后将其转换为 List。
使用 Apache Commons Collections 库
Map<String, Integer> nameMap = new HashMap<>();
nameMap.put("John", 25);
nameMap.put("Mary", 30);
nameMap.put("Bob", 28);
Map<Integer, String> invertedNameMap = MapUtils.invertMap(nameMap);
List<Integer> ages = new ArrayList<>(invertedNameMap.keySet());
System.out.println(ages); // 输出:[25, 30, 28]
Apache Commons Collections 库提供了 MapUtils.invertMap() 方法,它可以将 Map 的键和值互换。通过这个方法,我们可以轻松地将 Map 转换回 List。
常见问题解答
-
为什么需要在 List 和 Map 之间转换?
List 和 Map 是不同的数据结构,具有不同的特性。转换它们可以根据特定任务的需要操作数据。
-
哪个方法最适合将 List 转 Map?
最佳方法取决于具体情况。直接使用 put() 方法适用于需要自定义键值对的情况;Collectors.toMap() 方法提供了一个更简洁的解决方案;Apache Commons Collections 库提供了一个专门的 ListUtils.toMap() 方法。
-
哪个方法最适合将 Map 转 List?
与上一个问题类似,最佳方法取决于具体情况。entrySet() 和 stream() 方法提供了对 Map 的完整访问;keySet() 和 stream() 方法是一个更简单的方法,只返回键;Apache Commons Collections 库提供了 MapUtils.invertMap() 方法,可以轻松地将 Map 转换为一个具有交换键和值的 List。
-
如何处理重复的键?
使用 put() 方法转换 List 时,重复的键将覆盖以前的键值对。使用 Collectors.toMap() 方法时,重复的键将生成一个 IllegalStateException。
-
如何处理 null 值?
Map 无法存储 null 键或值。尝试这样做将导致 NullPointerException。