stream 分组后再根据key值排序写法
时间: 2023-08-03 15:07:38 浏览: 121
可以使用 Java 8 中的 Stream API 来实现分组后再根据 key 值排序。具体写法如下:
假设我们有一个 List<Student>,每个学生有姓名和分数两个属性,现在要按照分数分组后再按照分数从小到大排序,可以使用以下代码:
```
Map<Integer, List<Student>> map = students.stream()
.collect(Collectors.groupingBy(Student::getScore)); // 先按照分数分组
Map<Integer, List<Student>> sortedMap = new TreeMap<>(map); // 使用 TreeMap 对 map 进行排序
```
以上代码首先使用 `Collectors.groupingBy` 方法按照学生的分数进行分组,得到一个以分数为 key,以学生列表为 value 的 Map。
然后使用 `TreeMap` 对 map 进行排序,由于 TreeMap 是有序的,所以会按照 key 的自然顺序(即分数从小到大)进行排序。
最终得到的 sortedMap 就是按照分数分组后再按照分数从小到大排序的结果。
相关问题
stream 分组后再排序写法
可以使用 Java 8 中的 Stream API 来实现分组后再排序,具体写法如下:
假设我们有一个 List<Student>,每个学生有姓名和分数两个属性,现在要按照分数分组后再按照姓名排序,可以使用以下代码:
```
Map<Integer, List<Student>> map = students.stream()
.collect(Collectors.groupingBy(Student::getScore)); // 先按照分数分组
map.values().forEach(list -> {
list.sort(Comparator.comparing(Student::getName)); // 对每个分组内的学生按照姓名排序
});
```
以上代码首先使用 `Collectors.groupingBy` 方法按照学生的分数进行分组,得到一个以分数为 key,以学生列表为 value 的 Map。
然后使用 `forEach` 方法遍历每个分组内的学生列表,对每个列表使用 `sort` 方法按照学生姓名进行排序,这里使用了 `Comparator.comparing` 方法来生成一个以学生姓名为比较器的 Comparator。
最终得到的 map 就是按照分数分组后再按照姓名排序的结果。
Java8 stream groupingBy() 降序 写法
可以使用`Collectors.groupingBy()`结合`Collectors.counting()`和`Comparator.reverseOrder()`来实现分组后按值降序排序,示例代码如下:
```java
Map<String, Long> result = list.stream()
.collect(Collectors.groupingBy(Function.identity(), Collectors.counting()))
.entrySet()
.stream()
.sorted(Map.Entry.<String, Long>comparingByValue(Comparator.reverseOrder()))
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (oldValue, newValue) -> oldValue, LinkedHashMap::new));
```
解释一下:
1. `Collectors.groupingBy()`方法用来按照某个属性对流中的元素进行分组,其中`Function.identity()`表示按照元素本身进行分组。
2. `Collectors.counting()`方法用来统计每组元素的数量。
3. `Map.Entry.comparingByValue()`方法用来指定按照值进行排序,`Comparator.reverseOrder()`表示降序排列。
4. `Collectors.toMap()`方法用来将排序后的结果转化为一个`LinkedHashMap`,保留插入顺序。
最终的结果是一个`Map<String, Long>`类型的对象,其中`String`表示分组的属性,`Long`表示该属性在流中出现的次数。
阅读全文