vlambda博客
学习文章列表

Java8利用stream流快速排序(包括中文)

代码部分

利用stream的sorted()进行实现中文排序和数字排序(包括降序和升序),非常简单。

package com.chstar.elasticsearchdemo.utils;

import java.text.Collator;
import java.util.*;
import java.util.stream.Collectors;

public class Demo {
static class Student {//只是为了方便演示

private Integer id;
private String name;
private String grade;

public String getGrade() {
return grade;
}

public void setGrade(String grade) {
this.grade = grade;
}

public Integer getId() {
return id;
}

public void setId(Integer id) {
this.id = id;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public Student(Integer id, String name, String grade) {
this.id = id;
this.name = name;
this.grade = grade;
}

@Override
public String toString() {
return "Student{" +
"id=" + id +
", name='" + name + '\'' +
", grade='" + grade + '\'' +
'}';
}
}
public static void main(String[] args) {

//测试数据,可以看到顺序是乱的。
List<Student> user = new ArrayList<>();
user.add( new Student(1, "张三","一年级"));
user.add( new Student(4, "李四","三年级"));
user.add( new Student(2, "王五","二年级"));
user.add( new Student(3, "赵六","四年级"));

//按编号升序(默认)
List<Student> collect1 = user.stream().sorted(Comparator.comparingInt(Student::getId)).collect(Collectors.toList());
//遍历输出
System.out.println("编号升序");
collect1.forEach(System.out::println);
System.out.println("===========================================================================");

//按年级升序(默认)
List<Student> collect = user.stream()
.sorted((o1, o2) -> Collator.getInstance(Locale.TRADITIONAL_CHINESE).compare(o1.getGrade(),o2.getGrade())).collect(Collectors.toList());
//遍历输出
System.out.println("中文升序");
collect.forEach(System.out::println);
System.out.println("===========================================================================");

//按编号降序
List<Student> collect2 = user.stream().sorted((o1, o2) -> o2.getId() - o1.getId()).collect(Collectors.toList());
//遍历输出
System.out.println("编号降序");
collect2.forEach(System.out::println);
System.out.println("===========================================================================");

//按年级降序
List<Student> collect3 =
user.stream().sorted((o1, o2) -> Collator.getInstance(Locale.TRADITIONAL_CHINESE).compare(o2.getGrade(),o1.getGrade())).collect(Collectors.toList());
//遍历输出
System.out.println("中文降序");
collect3.forEach(System.out::println);
}
}

测试结果

stream确实好用一行代码搞定聚合、过滤、排序操作等。