Java 8中如何使用Lambda和Comparator进行排序呢?
下文笔者讲述java8中使用Lambda和Comparator进行排序的方法及示例分享,如下所示
根据age字段降序和升序的排序方式
Comparator排序
Comparator是 Java 8之前常用的排序方式例:Person类中使用age字段排序
@Data public class Person { private String name; private Integer age; public Person(String name, Integer age) { this.name = name; this.age = age; } } public class PersonTest { @Test public void testComparator (){ list<Person> list = new ArrayList<>(); list.add(new Person("张张", 30)); list.add(new Person("晓君", 20)); list.add(new Person("小关", 38)); list.add(new Person("少敏", 28)); list.add(new Person("小娟", 41)); Collections.sort(list, new Comparator<Person>() { @Override public int compare(Person o1, Person o2) { return o1.getAge() - o2.getAge(); } }); for (Person person : list) { System.out.println(person); } } } //运行以上代码,将输出以下信息 Person(name=晓君, age=20) Person(name=少敏, age=28) Person(name=张张, age=30) Person(name=小关, age=38) Person(name=小娟, age=41)
Lambda和Comparator排序
public class PersonTest { @Test public void testComparator () { List<Person> list = new ArrayList<>(); list.add(new Person("张张", 30)); list.add(new Person("晓君", 20)); list.add(new Person("小关", 38)); list.add(new Person("少敏", 28)); list.add(new Person("小娟", 41)); sort(list); list.forEach(System.out::println); } public List<Person> sort(List<Person> list) { Comparator<Person> byAge = (Person o1, Person o2) -> o1.getAge().compareTo(o2.getAge()); list.sort(byAge); return list; } } //运行以上代码,将输出以下信息 Person(name=晓君, age=20) Person(name=少敏, age=28) Person(name=张张, age=30) Person(name=小关, age=38) Person(name=小娟, age=41)
Lambda 结合函数接口来完成 Comparator 的定义操作 public List<Person> sort(List<Person> list) { Comparator<Person> byAge = Comparator.comparing(Person::getAge); list.sort(byAge); return list; } 当然也可以进一步简化代码,像下面这样 list.sort(Comparator.comparing(Person::getAge)); 当需要排其他字段排序,如 name 字段,可以直接改为 list.sort(Comparator.comparing(Person::getName));
3.排序反转
例:根据age字段降序和升序的排序方式
public class PersonTest { @Test public void testComparator () { List<Person> list = new ArrayList<>(); list.add(new Person("张张", 30)); list.add(new Person("晓君", 20)); list.add(new Person("小关", 38)); list.add(new Person("少敏", 28)); list.add(new Person("小娟", 41)); list.sort((p1, p2) -> p1.getAge() - p2.getAge()); list.forEach(System.out::println); System.out.println("--------"); list.sort((p1, p2) -> p2.getAge() - p1.getAge()); list.forEach(System.out::println); } } //运行以上代码,将输出以下信息 Person(name=晓君, age=20) Person(name=少敏, age=28) Person(name=张张, age=30) Person(name=小关, age=38) Person(name=小娟, age=41) ---------- Person(name=小娟, age=41) Person(name=小关, age=38) Person(name=张张, age=30) Person(name=少敏, age=28) Person(name=晓君, age=20) //或 Comparator<Person> comparing =Comparator.comparing(Person::getAge); list.sort(comparing); list.forEach(System.out::println); System.out.println("--------"); list.sort(comparing.reversed()); list.forEach(System.out::println);
4.Lambda和Comparator和Stream排序
使用stream的API 顺便排序可以使用stream的sorted方法 @Test public void testComparator () { List<Person> list = new ArrayList<>(); list.add(new Person("张张", 30)); list.add(new Person("晓君", 20)); list.add(new Person("小关", 38)); list.add(new Person("少敏", 28)); list.add(new Person("小娟", 41)); list.stream().sorted(Comparator.comparing(Person::getAge)) .forEach(System.out::println); System.out.println("----------"); list.stream().sorted(Comparator.comparing(Person::getAge).reversed()) .forEach(System.out::println); } } //运行以上代码,将输出以下信息 Person(name=晓君, age=20) Person(name=少敏, age=28) Person(name=张张, age=30) Person(name=小关, age=38) Person(name=小娟, age=41) ---------- Person(name=小娟, age=41) Person(name=小关, age=38) Person(name=张张, age=30) Person(name=少敏, age=28) Person(name=晓君, age=20)
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。