本文主要是介绍Guava-流式风格比较器Ordering,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
Ordering是Guava流畅风格比较器[Comparator]的实现,它可以用来为构建复杂的比较器,以完成集合排序的功能。从实现上说,Ordering实例就是一个特殊的Comparator实例。Ordering把很多基于Comparator的静态方法包装为自己的实例方法,并且提供了链式调用方法,来定制和增强现有的比较器。
创建排序器:
- natural() 对可排序类型做自然排序,如数字按大小,日期按先后排序
- usingToString() 按对象的字符串形式做字典排序
- from(Comparator) 把给定的Comparator转化为排序器
常用方法:
- reverse() 获取语义相反的排序器
- nullsFirst() 使用当前排序器,但额外把null值排到最前面。
- nullsLast() 使用当前排序器,但额外把null值排到最后面。
- compound(Comparator) 合成另一个比较器,以处理当前排序器中的相等情况。
- lexicographical() 基于处理类型T的排序器,返回该类型的可迭代对象Iterable的排序器。
- onResultOf(Function) 对集合中元素调用Function,再按返回值用当前排序器排序。
运用排序器:
- greatestOf(Iterable iterable, int k) 获取可迭代对象中最大的k个元素。
- isOrdered(Iterable) 判断可迭代对象是否已按排序器排序:允许有排序值相等的元素。
- sortedCopy(Iterable) 判断可迭代对象是否已严格按排序器排序:不允许排序值相等的元素.
- min(E, E) 返回两个参数中最小的那个。如果相等,则返回第一个参数。
- min(E, E, E, E…) 返回多个参数中最小的那个。如果有超过一个参数都最小,则返回第一个最小的参数。
- min(Iterable) 返回迭代器中最小的元素。如果可迭代对象中没有元素,则抛出NoSuchElementException。
Demo如下:
import com.google.common.collect.Lists;
import com.google.common.collect.Ordering;
import com.google.common.primitives.Ints;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
public class StudentByAge implements Comparator<Student> {@Overridepublic int compare(Student o1, Student o2) {return Ints.compare(o1.getAge(), o2.getAge());}public static void main(String[] args) {StudentByAge studentByAge = new StudentByAge();StudentByScore studentByScore = new StudentByScore();Student s1 = new Student("Li", 21, 55.0);Student s2 = new Student("Zhang", 22, 65.0);Student s3 = new Student("Wang", 20, 78.5);Student s4 = new Student("Sun", 21, 88.0);Student s5 = new Student("Wang", 20, 75.0);List<Student> students = Lists.newArrayList(s1, s2, s3, s4, s5);/*** 根据年龄排序正序*/Ordering<Student> orderByAge = Ordering.from(studentByAge);Collections.sort(students, orderByAge);for (Student item : students) {System.out.println(item);}System.out.println("-----------------------------------------------------");/*** 根据年龄排序倒叙*/Ordering<Student> orderByAgeReverse = Ordering.from(studentByAge).reverse();Collections.sort(students, orderByAgeReverse);for (Student item : students) {System.out.println(item);}System.out.println("-----------------------------------------------------");/*** 先根据年龄排序,再根据分数排序*/Ordering<Student> oderByAgeAndScore = Ordering.from(studentByAge).compound(studentByScore);Collections.sort(students, oderByAgeAndScore);for (Student item : students) {System.out.println(item);}System.out.println("-----------------------------------------------------");/*** 找出分数最高的两个同学*/Ordering<Student> oderByScore = Ordering.from(studentByScore);List<Student> topTwo = oderByScore.greatestOf(students, 2);for (Student item : topTwo) {System.out.println(item);}}
}
import com.google.common.primitives.Doubles;
import java.util.Comparator;
public class StudentByScore implements Comparator<Student> {@Overridepublic int compare(Student s1, Student s2) {return Doubles.compare(s1.getScore(), s2.getScore());}
}
public class Student {private String name;private Integer age;private Double score;public Student(String name, Integer age, Double score) {this.name = name;this.age = age;this.score = score;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}public Double getScore() {return score;}public void setScore(Double score) {this.score = score;}@Overridepublic String toString() {final StringBuffer sb = new StringBuffer("Student{");sb.append("name='").append(name).append('\'');sb.append(", age=").append(age);sb.append(", score=").append(score);sb.append('}');return sb.toString();}
}
这篇关于Guava-流式风格比较器Ordering的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!