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)
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。


