map.stream().sorted()
时间: 2025-02-18 16:58:51 浏览: 42
### Java Map 流操作与排序示例
对于 `Map` 类型的数据结构,在 Java 8 中可以利用流(Stream)API 进行高效的转换和排序。下面展示如何通过流的方式对 `Map` 的键值对进行排序。
#### 使用 Stream 对 Map 按照 Key 排序
当需要按照 `Map` 的 key 来排序时,可以通过创建一个新的 `LinkedHashMap` 并使用 `entrySet()` 方法获取条目集合作为输入给流管道:
```java
import java.util.*;
import java.util.stream.Collectors;
public class Main {
public static void main(String[] args) {
Map<String, Integer> unsortedMap = new HashMap<>();
unsortedMap.put("z", 1);
unsortedMap.put("b", 2);
unsortedMap.put("a", 3);
// 创建按key升序排列的新map
Map<String, Integer> result = unsortedMap.entrySet()
.stream()
.sorted(Map.Entry.comparingByKey())
.collect(Collectors.toMap(
Map.Entry::getKey,
Map.Entry::getValue,
(oldValue, newValue) -> oldValue,
LinkedHashMap::new));
System.out.println(result); // 输出 {a=3, b=2, z=1}
}
}
```
此代码片段展示了如何先将原始映射中的项转成流,再调用 `sorted()` 函数指定比较器来进行按键排序,最后收集回新的有序映射[^1]。
#### 使用 Stream 对 Map 按 Value 排序
如果目标是对 value 值做降序或升序排列,则可以在上述基础上修改 `comparingByKey()` 成 `comparingByValue()` 或者自定义 comparator:
```java
// 创建按value降序排列的新map
Map<String, Integer> sortedByValueDesc = unsortedMap.entrySet()
.stream()
.sorted((e1, e2) -> e2.getValue().compareTo(e1.getValue()))
.collect(Collectors.toMap(
Map.Entry::getKey,
Map.Entry::getValue,
(v1, v2) -> v1,
LinkedHashMap::new));
System.out.println(sortedByValueDesc); // 根据具体数据输出不同的结果
```
这里采用了 lambda 表达式的写法来自定义两个 entry 之间的对比逻辑,从而实现基于 value 的逆向排序[^2]。
另外值得注意的是,为了保持插入顺序以及避免覆盖相同 key 下的不同 values,在最终收集阶段选择了 `LinkedHashMap` 而不是普通的 `HashMap`.
阅读全文
相关推荐



















