JAVA 8 stream排序,分组统计常用操作
JAVA 8 stream流操作
新建实体类 Student
@Data
@NoArgsConstructor
@AllArgsConstructor
public static class Student{
private String name;
private Integer age;
}
一.按年龄排序
public static void main(String[] args) {
List<Student> list = new ArrayList<>();
list.add(new Student("张三",18));
list.add(new Student("李四",19));
list.add(new Student("王五",16));
List<Student> collect = list.stream().sorted(Comparator.comparing(Student::getAge)).collect(Collectors.toList());
collect.forEach(System.out::println);
}
// 打印结果
// AttendanceServiceImpl.Student(name=王五, age=16)
// AttendanceServiceImpl.Student(name=张三, age=18)
// AttendanceServiceImpl.Student(name=李四, age=19)
二.按姓名分组并统计总年龄
public static void main(String[] args) {
List<Student> list = new ArrayList<>();
list.add(new Student("张三",18));
list.add(new Student("张三",19));
list.add(new Student("王五",16));
Map<String, Integer> collect = list.stream().collect(Collectors.groupingBy(Student::getName, Collectors.summingInt(x -> x.getAge())));
collect.keySet().forEach(System.out::println);
//打印结果
// 张三
// 王五
List<Student> list2 = new ArrayList<>();
collect.keySet().forEach(x-> {
Student student = new Student();
student.setName(x);
student.setAge(collect.get(x));
list2.add(student);
});
list2.forEach(System.out::println);
// 结果
// AttendanceServiceImpl.Student(name=张三, age=37)
// AttendanceServiceImpl.Student(name=王五, age=16)
}
三.去除相同年龄的学生总数
因为java没有提供根据某个属性分组的办法,得自己实现,代码如下:
public static <T> Predicate<T> distinctByKey(Function<? super T, ?> keyExtractor) {
Map<Object,Boolean> seen = new ConcurrentHashMap<>();
return t -> seen.putIfAbsent(keyExtractor.apply(t), Boolean.TRUE) == null;
}
实现代码
public static void main(String[] args) {
List<Student> list = new ArrayList<>();
list.add(new Student("张三",18));
list.add(new Student("李四",19));
list.add(new Student("王五",18));
long count = list.stream().filter(distinctByKey(Student::getAge)).count();
System.out.println(count);
}
// 打印结果 2