Java 8 Map转List方法详解
概述
在Java 8中,使用Stream API可以方便地将Map转换为List。常见的转换需求包括提取键、值或键值对,以及将Map中的数据映射为自定义对象。
准备工作
假设我们有一个Map:
Map<String, Integer> map = new HashMap<>();
map.put("A", 1);
map.put("B", 2);
map.put("C", 3);1. 将键转换为List
使用map.keySet().stream()将键集合转换为Stream,然后收集到List。
- 调用
map.keySet()获取所有键的Set。 - 调用
stream()方法创建Stream。 - 使用
collect(Collectors.toList())收集为List。
示例代码:
List<String> keyList = map.keySet()
.stream()
.collect(Collectors.toList());
System.out.println(keyList); // [A, B, C]2. 将值转换为List
类似地,使用map.values().stream()将值集合转换为List。
- 调用
map.values()获取所有值的Collection。 - 调用
stream()方法。 - 使用
collect(Collectors.toList())收集。
示例代码:
List<Integer> valueList = map.values()
.stream()
.collect(Collectors.toList());
System.out.println(valueList); // [1, 2, 3]3. 将键值对(Entry)转换为List
使用map.entrySet().stream()将Entry集合转换为List。
- 调用
map.entrySet()获取所有Entry的Set。 - 调用
stream()方法。 - 使用
collect(Collectors.toList())收集。
示例代码:
List<Map.Entry<String, Integer>> entryList = map.entrySet()
.stream()
.collect(Collectors.toList());
System.out.println(entryList); // [A=1, B=2, C=3]4. 将Entry映射为自定义对象
如果我们需要将每个Entry转换为自定义对象,可以结合map()操作。
假设有一个简单的Pair类:
public class Pair {
private String key;
private Integer value;
// 构造器、getter/setter 略
}步骤:
- 获取Entry流:
map.entrySet().stream()。 - 使用
map()将每个Entry转换为Pair对象。 - 收集到List。
示例代码:
List<Pair> pairList = map.entrySet()
.stream()
.map(entry -> new Pair(entry.getKey(), entry.getValue()))
.collect(Collectors.toList());5. 使用自定义排序的List
如果需要按特定顺序(如按键排序),可以在收集前使用sorted()。
按键排序:
List<String> sortedKeyList = map.keySet()
.stream()
.sorted()
.collect(Collectors.toList());按值排序:
List<Integer> sortedValueList = map.entrySet()
.stream()
.sorted(Map.Entry.comparingByValue())
.map(Map.Entry::getValue)
.collect(Collectors.toList());6. 转换为ArrayList或LinkedList
Collectors.toList()通常返回ArrayList。如果需要特定类型,可以使用Collectors.toCollection()。
List<String> linkedList = map.keySet()
.stream()
.collect(Collectors.toCollection(LinkedList::new));7. 处理Null值
如果Map中包含null键或值,需要注意流操作中可能抛出空指针。可以使用filter()过滤null。
List<String> nonNullKeys = map.keySet()
.stream()
.filter(Objects::nonNull)
.collect(Collectors.toList());总结
Java 8的Stream API提供了灵活的方式将Map转换为List。通过组合keySet()、values()、entrySet()以及map()、sorted()、filter()等操作,可以满足各种转换需求。建议根据具体场景选择合适的方法。
参考:Java 8 Stream文档