Java 8 Lambda 和 Comparator 排序

这里将演示 Java 8 中,几种使用 Ladmbda 结合 Comparator 进行 List 排序(升序或降序)的方式。
  1. 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("老王", 20));
        list.add(new Person("老李", 10));
        list.add(new Person("老徐", 28));
        list.add(new Person("老陈", 18));
        list.add(new Person("老艾", 31));
        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=10)
Person(name=老陈, age=18)
Person(name=老王, age=20)
Person(name=老徐, age=28)
Person(name=老艾, age=31)

这里是一个匿名内部类方式的实现,为了一行排序代码写的代码是不是有点多了?

2. Lambda 和 Comparator 排序

public class PersonTest {

    @Test
    public void testComparator () {
        List<Person> list = new ArrayList<>();
         list.add(new Person("老王", 20));
        list.add(new Person("老李", 10));
        list.add(new Person("老徐", 28));
        list.add(new Person("老陈", 18));
        list.add(new Person("老艾", 31));
        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=10)
Person(name=老陈, age=18)
Person(name=老王, age=20)
Person(name=老徐, age=28)
Person(name=老艾, age=31)

也可以使用 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("老王", 20));
        list.add(new Person("老李", 10));
        list.add(new Person("老徐", 28));
        list.add(new Person("老陈", 18));
        list.add(new Person("老艾", 31));
        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=10)
Person(name=老陈, age=18)
Person(name=老王, age=20)
Person(name=老徐, age=28)
Person(name=老艾, age=31)
----------
Person(name=老艾, age=31)
Person(name=老徐, age=28)
Person(name=老王, age=20)
Person(name=老陈, age=18)
Person(name=老李, age=10)

也可以用另外的一种方式:

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("老王", 20));
        list.add(new Person("老李", 10));
        list.add(new Person("老徐", 28));
        list.add(new Person("老陈", 18));
        list.add(new Person("老艾", 31));
        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=10)
Person(name=老陈, age=18)
Person(name=老王, age=20)
Person(name=老徐, age=28)
Person(name=老艾, age=31)
----------
Person(name=老艾, age=31)
Person(name=老徐, age=28)
Person(name=老王, age=20)
Person(name=老陈, age=18)
Person(name=老李, age=10)

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
通过使用lambda表达式,可以实现Java数组的降序排列。下面是一个使用lambda表达式对整数数组进行降序排列的示例代码: ```java Integer a[] = new Integer[]{1, 3, 5, 2, 4, 6}; System.out.println("排序前:"); System.out.println(Arrays.toString(a)); System.out.println("降序排序:"); Arrays.sort(a, (o1, o2) -> o2 - o1); System.out.println(Arrays.toString(a)); ``` 在这个示例中,我们首先定义了一个整数数组a,并输出了排序前的数组内容。然后,通过调用`Arrays.sort()`方法,并传入lambda表达式`(o1, o2) -> o2 - o1`作为比较器,实现了降序排序。最后,我们再次输出排序后的数组内容。 同样地,我们也可以使用lambda表达式对字符串数组进行降序排列。下面是一个示例代码: ```java String[] str = new String[]{"fgh", "abc", "cde", "bcd", "efg", "def"}; System.out.println("排序前:"); System.out.println(Arrays.toString(str)); System.out.println("降序排序:"); Arrays.sort(str, (x, y) -> y.compareTo(x)); System.out.println(Arrays.toString(str)); ``` 在这个示例中,我们定义了一个字符串数组str,并输出了排序前的数组内容。然后,通过调用`Arrays.sort()`方法,并传入lambda表达式`(x, y) -> y.compareTo(x)`作为比较器,实现了降序排序。最后,我们再次输出排序后的数组内容。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [【Java数组】使用lambda表达式对包装类数组和字符串数组进行排序](https://blog.csdn.net/Awt_FuDongLai/article/details/115585159)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [Java8新特性Lambda表达式的一些复杂用法总结](https://download.csdn.net/download/weixin_38692100/12776783)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值