Guava:Ordering对象多属性排序
Person多字段排序结果
针对Person对象,根据年龄升序,字段为空放最前面,再根据名称进行升序,空字符放最后面,最后根据排序字段进行升序排序。
import com.google.common.base.Function;
import com.google.common.collect.Lists;
import com.google.common.collect.Ordering;
import lombok.Data;
import lombok.ToString;
import java.io.Serializable;
import java.util.List;
public class TestGuava {
public static void main(String[] args) {
List<Person> persons = Lists.newArrayListWithExpectedSize(4);
persons.add(new Person(11, "libai",(short)1));
persons.add(new Person(99, "wangwu",(short)2));
persons.add(new Person(null, "zhangsan",(short)8));
persons.add(new Person(15, "aba",(short)8));
persons.add(new Person(15, "aba",(short)9));
persons.add(new Person(15, "jim",(short)7));
persons.add(new Person(15, "wan",null));
System.out.println("正常排序=====");
persons.forEach(System.out::println);
Ordering<Person> orderAge = Ordering.natural().nullsFirst().onResultOf(new Function<Person, Integer>() {
@Override
public Integer apply(Person person) {
return person.getAge();
}
});
Ordering<Person> orderName = Ordering.natural().nullsLast().onResultOf(new Function<Person, String>() {
@Override
public String apply(Person person) {
return person.getName();
}
});
Ordering<Person> orderOrderNo = Ordering.natural().nullsLast().onResultOf(new Function<Person, Short>() {
@Override
public Short apply(Person person) {
return person.getOrderNo();
}
});
List<Person> mutilResult = Ordering.from(orderAge).compound(orderName).compound(orderOrderNo).sortedCopy(persons);
System.out.println("多字段排序结果:按照年龄,排序,名称排序");
mutilResult.forEach(System.out::println);
}
}
@Data
@ToString
class Person implements Serializable {
private Integer age;
private String name;
private Short orderNo;
public Person(Integer age, String name) {
this.age = age;
this.name = name;
}
public Person(Integer age, String name, Short orderNo) {
this.age = age;
this.name = name;
this.orderNo = orderNo;
}
}