java lambda分组后再排序
时间: 2023-10-23 21:08:46 浏览: 78
可以使用Java 8中的Stream API和lambda表达式来分组并排序。假设我们有一个Person类,它有一个属性age(年龄),我们想按年龄将人员分组并按姓名排序。代码示例如下:
```java
List<Person> people = new ArrayList<>();
// 添加人员信息
Map<Integer, List<Person>> groups = people.stream()
.collect(Collectors.groupingBy(Person::getAge)); // 按年龄分组
groups.forEach((age, group) -> {
List<Person> sortedGroup = group.stream()
.sorted(Comparator.comparing(Person::getName)) // 按姓名排序
.collect(Collectors.toList());
System.out.println("Age: " + age);
sortedGroup.forEach(System.out::println);
});
```
上述代码首先使用 `Collectors.groupingBy` 方法按年龄对人员进行分组,然后使用 `forEach` 方法遍历每个分组,接着使用 `sorted` 方法按姓名对分组中的人员进行排序,并最终输出每个分组中的人员信息。
相关问题
Java lambda 先分组,在对每组进行排序
Java 8 中提供了 `Collectors.groupingBy()` 和 `Collectors.collectingAndThen()` 方法来实现先分组,再对每组进行排序的操作。
具体实现步骤如下:
1. 使用 `Collectors.groupingBy()` 方法将元素按照某个属性分组,得到一个 `Map` 对象,其中键为属性值,值为相应的元素列表。
2. 对于每个分组,使用 `Collectors.collectingAndThen()` 方法对其进行排序,得到排序后的元素列表。
3. 将每个分组的排序后的元素列表合并为一个最终的列表。
示例代码如下:
```
List<Student> students = Arrays.asList(
new Student("Tom", 20, "Math"),
new Student("Jerry", 22, "English"),
new Student("Lucy", 21, "Math"),
new Student("Lily", 19, "English"),
new Student("Bob", 23, "Math"),
new Student("Mike", 18, "English")
);
// 先按课程分组,再对每组按年龄从小到大排序
List<Student> result = students.stream()
.collect(Collectors.groupingBy(Student::getCourse,
Collectors.collectingAndThen(
Collectors.toList(),
list -> list.stream()
.sorted(Comparator.comparingInt(Student::getAge))
.collect(Collectors.toList())
)
))
.values()
.stream()
.flatMap(Collection::stream)
.collect(Collectors.toList());
System.out.println(result);
```
输出结果为:
```
[Student{name='Lily', age=19, course='English'}, Student{name='Mike', age=18, course='English'}, Student{name='Tom', age=20, course='Math'}, Student{name='Lucy', age=21, course='Math'}, Student{name='Bob', age=23, course='Math'}, Student{name='Jerry', age=22, course='English'}]
```
其中,`Student` 类的定义如下:
```java
class Student {
private String name;
private int age;
private String course;
public Student(String name, int age, String course) {
this.name = name;
this.age = age;
this.course = course;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
public String getCourse() {
return course;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
", course='" + course + '\'' +
'}';
}
}
```
以上代码将学生按照课程分组,然后对每个分组按照年龄从小到大排序,最后将每个分组的排序后的学生列表合并为一个最终的学生列表。
lambda表达式 java排序
在Java中,Lambda表达式可以用于进行排序操作。Lambda表达式是一种简洁的语法,可以用来创建匿名函数,可以将其作为参数传递给方法或作为函数式接口的实现。
对于排序操作,可以使用Comparator接口的comparing方法来创建比较器。比较器可以根据所选字段进行排序,可以使用多个字段进行多条件排序。
下面是一个示例,展示了使用Lambda表达式进行多条件排序的方法:
```java
List<Student> students = new ArrayList<>();
// 添加学生对象到列表中
students.sort(Comparator.comparing(Student::getName)
.thenComparing(Student::getAge)
.thenComparing(Student::getId));
```
在上述示例中,我们首先使用`comparing`方法按照姓名对学生进行排序,然后使用`thenComparing`方法按照年龄进行排序,最后再使用`thenComparing`方法按照学生ID进行排序。这样就可以实现多条件排序。
通过Lambda表达式,我们可以更简洁地实现排序操作。Lambda表达式可以减少样板代码,并且可以更直观地表达排序逻辑。使用lambda表达式进行排序可以提高代码的可读性和可维护性。
参考文献:
一、使用java的lambda表达式多条件排序
主要介绍了lambda表达式解决java后台分组排序过程解析
第三版应该是比较纯粹的lambda表达式。很满意。
第二版开始使用lambda表达式 <span class="em">1</span><span class="em">2</span><span class="em">3</span><span class="em">4</span>
阅读全文