Java 8中如何使用Lambda和Comparator进行排序呢?

乔欣 Java经验 发布时间:2023-07-07 15:23:31 阅读数:9379 1
下文笔者讲述java8中使用Lambda和Comparator进行排序的方法及示例分享,如下所示

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)
版权声明

本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。

本文链接: https://www.Java265.com/JavaJingYan/202307/16887146527027.html

最近发表

热门文章

好文推荐

Java265.com

https://www.java265.com

站长统计|粤ICP备14097017号-3

Powered By Java265.com信息维护小组

使用手机扫描二维码

关注我们看更多资讯

java爱好者