Collectors.groupingBy()
是 Java 8 引入的一个非常有用的流操作,它允许你根据某个属性对集合中的元素进行分组。然而,groupingBy()
默认返回的是一个 HashMap
,它不保证元素的顺序。如果你想要返回一个排序后的 LinkedHashMap
,你需要在收集结果之后对其进行排序。
以下是一个示例代码,展示了如何实现这一点:
import java.util.*;
import java.util.stream.Collectors;
public class GroupingByExample {
public static void main(String[] args) {
List<Person> people = Arrays.asList(
new Person("Alice", 20),
new Person("Bob", 30),
new Person("Charlie", 20),
new Person("David", 30),
new Person("Eve", 25)
);
// 使用 Collectors.groupingBy() 分组,并将结果转换为 LinkedHashMap
Map<Integer, List<Person>> groupedByAge = people.stream()
.collect(Collectors.groupingBy(Person::getAge))
.entrySet().stream()
.sorted(Map.Entry.comparingByKey())
.collect(Collectors.toMap(
Map.Entry::getKey,
Map.Entry::getValue,
(oldValue, newValue) -> oldValue,
LinkedHashMap::new
));
// 打印结果
groupedByAge.forEach((age, list) -> {
System.out.println(age + ": " + list);
});
}
}
class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
@Override
public String toString() {
return name;
}
}
在这个示例中,我们首先使用 Collectors.groupingBy()
根据年龄对人员进行分组。然后,我们对分组的结果进行排序,并将其转换为 LinkedHashMap
。这里的关键步骤是使用 entrySet().stream()
来获取分组的条目流,然后使用 sorted(Map.Entry.comparingByKey())
对这些条目按照键(在这个例子中是年龄)进行排序。最后,我们使用 Collectors.toMap()
将排序后的条目收集到一个新的 LinkedHashMap
中。
参考链接:
这种方法的优势在于它保持了分组的顺序,并且可以很容易地集成到现有的流操作中。它适用于任何需要对分组结果进行排序的场景,例如当你需要按照某个属性展示分组数据时。
云+社区沙龙online [技术应变力]
Elastic 中国开发者大会
云+社区沙龙online第5期[架构演进]
原引擎 | 场景实战系列
腾讯技术创作特训营第二季
云+社区开发者大会 武汉站
云+社区开发者大会 长沙站
腾讯云GAME-TECH游戏开发者技术沙龙
DBTalk
云+社区技术沙龙[第5期]
领取专属 10元无门槛券
手把手带您无忧上云