Java8的Lambda和排序

 更新时间:2021年11月04日 15:04:34   作者:banq  
这篇文章主要介绍了Java8的Lambda和排序,对数组和集合进行排序是Java 8 lambda令人惊奇的一个应用,我们可以实现一个Comparators来实现各种排序,下面文章将有案例详细说明,想要了解得小伙伴可以参考一下

对数组和集合进行排序是Java 8 lambda令人惊奇的一个应用,我们可以实现一个Comparators来实现各种排序。

看下面案例:

static class Person {

    final String firstName;

    final String lastName;

 
  
    Person(String firstName, String lastName) {

        this.firstName = firstName;

        this.lastName = lastName;

    }

 

    @Override

    public String toString() {

        return "Person{" +

                "firstName='" + firstName + '\'' +

                ", lastName='" + lastName + '\'' +

                '}';

    }

}

Person的数据有:

List<Person> people =

Arrays.asList(

    new Person("Jane", "Henderson"),

    new Person("Michael", "White"),

    new Person("Henry", "Brighton"),

    new Person("Hannah", "Plowman"),

    new Person("William", "Henderson")

);

我们希望根据名字排序(last name),然后再根据姓(first name)排序。

在Java 7之前,我们通常是通过实现一个Comparator:

people.sort(new Comparator<Person>() {

  @Override

  public int compare(Person o1, Person o2) {

    int result = o1.lastName.compareTo(o2.lastName);

 

    if (result == 0)

      result = o1.firstName.compareTo(o2.firstName);

 

    return result;

  }

});

people.forEach(System.out::println);

而在Java 8中,我们可以使用lambda替代匿名函数,如下:

Comparator<Person> c = (p, o) -> p.lastName.compareTo(o.lastName);

 

c = c.thenComparing((p, o) -> p.firstName.compareTo(o.firstName));

 

people.sort(c);

people.forEach(System.out::println);

在这里,Lambda表达式 (p, o) -> p.lastName.compareTo(o.lastName)替代之前的匿名函数new Comparator<Person>() {}

因为Java编译器并不能推迟对Lambda表达式类型判断,比如延迟到将comparator传递到sort()方法,因此使得我们进行链式Comparator书写有点困难,

比如我们想写成如下:

 
XXX.thenComparing((p, o) -> p.lastName.compareTo(o.lastName))
       .thenComparing((p, o) -> p.firstName.compareTo(o.firstName))

换句话说,类型判断是从左到右,而不是从右到左,我们可以通过创建一个泛型来进行类型推断:

class Utils {

    static <E> Comparator<E> compare() {

        return (e1, e2) -> 0;

    }

}

通过上面的compare()方法,我们可以书写流畅的comparator链:

people.sort(

    Utils.<Person>compare()

         .thenComparing((p, o) ->

              p.lastName.compareTo(o.lastName))

         .thenComparing((p, o) ->

              p.firstName.compareTo(o.firstName))

);

 

people.forEach(System.out::println);

到此这篇关于Java8的Lambda和排序的文章就介绍到这了,更多相关Java Lambda和排序内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java SE求解汉诺塔问题的示例代码

    Java SE求解汉诺塔问题的示例代码

    汉诺塔问题是一个经典的问题。汉诺塔(Hanoi Tower),又称河内塔,源于印度一个古老传说。本文将用Java SE求解这一问题,感兴趣的可以学习一下
    2022-03-03
  • 解决springboot引入swagger2不生效问题

    解决springboot引入swagger2不生效问题

    这篇文章主要为大家介绍了解决springboot引入swagger2不生效问题的方案,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-05-05
  • Java实现双链表互相交换任意两个节点的方法示例

    Java实现双链表互相交换任意两个节点的方法示例

    这篇文章主要介绍了Java实现双链表互相交换任意两个节点的方法,简单讲述了双链表的概念,并结合实例形式给出了java双链表实现任意两个节点交换的操作技巧,需要的朋友可以参考下
    2017-11-11
  • JAVA读取文本文件内容实例代码

    JAVA读取文本文件内容实例代码

    这篇文章主要给大家介绍了关于JAVA读取文本文件内容的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用Java具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-09-09
  • Java中间消息件ActiveMQ使用实例

    Java中间消息件ActiveMQ使用实例

    这篇文章主要介绍了Java中间消息件ActiveMQ使用实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-11-11
  • SpringBoot 中大文件(分片上传)断点续传与极速秒传功能的实现

    SpringBoot 中大文件(分片上传)断点续传与极速秒传功能的实现

    这篇文章主要介绍了SpringBoot 中大文件(分片上传)断点续传与极速秒传功能的实现,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-07-07
  • JVM指令的使用深入详解

    JVM指令的使用深入详解

    这篇文章主要给大家介绍了关于JVM指令使用的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-01-01
  • 使用Java根据文件路径下载zip文件到本地代码示例

    使用Java根据文件路径下载zip文件到本地代码示例

    在开发过程中我们会遇到需要对文件进行压缩并下载的功能需求,这篇文章主要给大家介绍了关于如何使用Java根据文件路径下载zip文件到本地的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-03-03
  • spring boot中的properties参数配置详解

    spring boot中的properties参数配置详解

    这篇文章主要介绍了spring boot中的properties参数配置,需要的朋友可以参考下
    2017-09-09
  • SpringBoot3整合SpringDoc OpenAPI生成接口文档的详细过程

    SpringBoot3整合SpringDoc OpenAPI生成接口文档的详细过程

    SpringDoc OpenAPI 是一个强大的工具,能够帮助我们轻松生成 OpenAPI 3.0 规范的文档,并提供交互式的 Swagger UI 界面,所以本文给大家介绍了SpringBoot3整合SpringDoc OpenAPI生成接口文档的详细过程,需要的朋友可以参考下
    2024-07-07

最新评论