Comparator类从Java 1.2版本就已经有了,在Java8开始,加入了适用于Lambda的一些方法,使代码编写更加简洁。
在Java中对汉字进行排序,其实是没有规则的,要按照汉字进行排序,需要做一点处理。
对汉字排序,需要定义另一个对象:Collator instance = Collator.getInstance(Locale.CHINA),Collator指定了所在区域,基于Collator进行排序,汉字就可以做到正确排序了。
Demo演示了基于汉字进行多属性排序,同时用了三种方法演示了排序代码,包括:匿名类、lambda和lambda表达式进行排序。
代码:
import java.text.Collator;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
import java.util.Locale;
/**
* Java8 Comparator排序,演示了基于汉字多字段排序
* 直接使用汉字排序是无效的,需要特殊处理一下
*/
public class ComparatorTest2 {
public static void main(String[] args) {
Person p1 = new Person();
p1.setAge(20);
p1.setName("张三");
Person p2 = new Person();
p2.setAge(20);
p2.setName("李四");
Person p3 = new Person();
p3.setAge(18);
p3.setName("王五");
Person p4 = new Person();
p4.setAge(25);
p4.setName("周六");
Person p5 = new Person();
p5.setAge(21);
p5.setName("李四");
List<Person> personList = Arrays.asList(p1, p2, p3, p4, p5);
//用三种方式进行排序,分别是匿名类、lambda和lambda表达式进行排序
//1、匿名类按照汉字进行排序
personList.sort(new Comparator<Person>() {
@Override
public int compare(Person o1, Person o2) {
Collator instance = Collator.getInstance(Locale.CHINA);
return instance.compare(o1.getName(),o2.getName());
}
});
personList.forEach(System.out::println);
System.out.println("------------------------------------------------");
//2、lambda表达式按照单个汉字属性进行排序
personList.sort((o1, o2) -> {
Collator instance = Collator.getInstance(Locale.CHINA);
return instance.compare(o1.getName(),o2.getName());
});
personList.forEach(System.out::println);
System.out.println("------------------------------------------------");
//2、定义独立的lambda表达式,实现多属性排序,先按照汉字升序排序,汉字相同则按照年龄降序排序
Comparator<Person> personComparator = (Person o1, Person o2) -> {
Collator instance = Collator.getInstance(Locale.CHINA);
return instance.compare(o1.getName(), o2.getName());
};
personList.sort(personComparator.thenComparing(Person::getAge, Comparator.reverseOrder()));
personList.forEach(System.out::println);
}
}
/*
//匿名类按照汉字进行排序
Person(name=李四, age=20, address=null, amount1=null, amount2=null)
Person(name=李四, age=21, address=null, amount1=null, amount2=null)
Person(name=王五, age=18, address=null, amount1=null, amount2=null)
Person(name=张三, age=20, address=null, amount1=null, amount2=null)
Person(name=周六, age=25, address=null, amount1=null, amount2=null)
------------------------------------------------
//lambda表达式按照汉字进行排序
Person(name=李四, age=20, address=null, amount1=null, amount2=null)
Person(name=李四, age=21, address=null, amount1=null, amount2=null)
Person(name=王五, age=18, address=null, amount1=null, amount2=null)
Person(name=张三, age=20, address=null, amount1=null, amount2=null)
Person(name=周六, age=25, address=null, amount1=null, amount2=null)
------------------------------------------------
//定义lambda表达式,实现多属性排序,先按照汉字升序排序,汉字相同则按照年龄降序排序
Person(name=李四, age=21, address=null, amount1=null, amount2=null)
Person(name=李四, age=20, address=null, amount1=null, amount2=null)
Person(name=王五, age=18, address=null, amount1=null, amount2=null)
Person(name=张三, age=20, address=null, amount1=null, amount2=null)
Person(name=周六, age=25, address=null, amount1=null, amount2=null)
*/