简单的排序一般用一个sorted就行
list = list.stream().sorted(Comparator.comparing(TestSort::getState)).collect(Collectors.toList());
再稍微多一个字段,说不定加一个.thenComparing(TestSort::getCode).reversed()也能实现需求
//reversed()倒序排列,默认都是从小到大排序,加上reversed实现倒序
list = list.stream().sorted(Comparator.comparing(TestSort::getState)
.thenComparing(TestSort::getCode).reversed()).collect(Collectors.toList());
但有一些稍微复杂的,存在逻辑的判断,就需要自定义排序。
比如根据多个字段比较排序,根据指定的中文排序,等等。都可以用Collections.sort,重写compare方法。
可以自己先通过一个小demo理解一下compare返回值,多考虑各种情况,排序需求基本都能实现。
需求:把state为3、5的值置顶后,根据code排序。
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;
/**
* @author ZoeySir
*/
public class TestSort {
private int code;
private int state;
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
public int getState() {
return state;
}
public void setState(int state) {
this.state = state;
}
public TestSort(int code, int state) {
this.code = code;
this.state = state;
}
public static void main(String[] args) {
TestSort s1 = new TestSort(2, 5);
TestSort s2 = new TestSort(4, 1);
TestSort s3 = new TestSort(5, 2);
TestSort s4 = new TestSort(3, 3);
TestSort s5 = new TestSort(1, 2);
List<TestSort> sortList = Stream.of( s1,s4, s2,s5,s3).collect(Collectors.toList());
//自定义对象字段排序
//需求:把state为3、5的值置顶后,根据code排序
Collections.sort(sortList, new Comparator<TestSort>() {
/**
* 两个对象做比较,自定义排序
*/
@Override
public int compare(TestSort o1, TestSort o2) {
//返回值解释:返回值为-1 、0、1
//-1代表左边小于右边,即o1 < o2
//0代表相等,即o1 = o2
//1代表左边大于右边,即o1 > o2
if (o1.getState() == 3 || o1.getState() == 5 ){
if (o1.getCode() > o2.getCode()){
return 1;
}
return -1;
}
if (o2.getState() == 3 || o2.getState() == 5){
return 1;
}
if (o1.getCode() < o2.getCode()){
return -1;
}
if (o1.getCode() > o2.getCode()){
return 1;
}
return 0;
}
});
for (TestSort t : sortList) {
System.out.println(t.getCode() + "===" + t.getState());
}
}
}
输出:
perfect~