stream groupingby 排序
时间: 2023-08-19 10:54:02 浏览: 115
Java Stream 的 grouppingBy 方法是将流中的元素按照指定条件进行分组的方法。具体而言,此方法的参数为一个 Function 对象,表示用来进行分组的条件,其返回的值将作为分组的键值;返回值则是一个 Map 对象,其中的键值就是分组的键值,对应的值则是一个 List,其中包含了符合该分组条件的所有元素。
相关问题
stream流groupingby后排序
在Java 8及以上版本中,你可以使用`Collectors.groupingBy()`方法将流按照指定的分类器(如Lambda表达式)分组。如果你希望对分组后的结果进行排序,可以在`groupingBy()`方法后面使用`Collectors.toMap()`方法,指定排序的方式。
例如,假设你有一个`Person`类,其中包含姓名和年龄属性,你希望按照年龄将这些人分组,并且对每个年龄分组内的人按照姓名进行排序。你可以这样实现:
```
List<Person> people = Arrays.asList(
new Person("Alice", 25),
new Person("Bob", 30),
new Person("Charlie", 25),
new Person("David", 35)
);
Map<Integer, List<Person>> groupedPeople = people.stream()
.collect(Collectors.groupingBy(Person::getAge,
TreeMap::new, //使用TreeMap进行排序
Collectors.toList()));
groupedPeople.forEach((age, group) -> {
System.out.println("Age: " + age);
group.forEach(person -> System.out.println(" " + person.getName()));
});
```
在这个例子中,`groupingBy()`方法使用`Person::getAge`作为分类器,将人按照年龄分组。然后,`toMap()`方法指定了一个`TreeMap`作为排序方式,并将每个年龄分组内的人以列表形式进行收集。
最后,使用`forEach()`方法遍历分组后的结果,并打印出每个年龄分组以及该分组内的人的姓名。注意,由于使用了`TreeMap`进行排序,因此每个年龄分组内的人的姓名将按照字母顺序排列。
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`表示该属性在流中出现的次数。
阅读全文