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和排序内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Mybatis核心组成部分之SQL映射文件揭秘详解

    Mybatis核心组成部分之SQL映射文件揭秘详解

    MyBatis真正的力量是在映射语句中,下面这篇文章主要给大家介绍了关于Mybatis核心组成部分之SQL映射文件揭秘的相关资料,现在分享给大家,给大家做个参考。一起跟随小编过来看看吧
    2018-11-11
  • Spring BeanPostProcessor后处理器源码解析

    Spring BeanPostProcessor后处理器源码解析

    这篇文章主要介绍了Spring BeanPostProcessor后处理器源码解析,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2023-09-09
  • 详解java IO流之缓冲流的使用

    详解java IO流之缓冲流的使用

    本文主要介绍了java的IO流中的缓冲流的使用,缓冲流分为字节和字符缓冲流。分享了有关它们的实例代码,具有一定的参考价值,下面跟着小编一起来看下吧
    2017-01-01
  • java用户名密码验证示例代码分享

    java用户名密码验证示例代码分享

    这篇文章主要介绍了java用户名密码验证示例代码,需要的朋友可以参考下
    2014-03-03
  • java如何获取map中value的最大值

    java如何获取map中value的最大值

    这篇文章主要介绍了java如何获取map中value的最大值问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-05-05
  • Spring Boot 微信小程序接入微信支付功能

    Spring Boot 微信小程序接入微信支付功能

    本文详细介绍了使用SpringBoot框架接入微信支付的全流程,包括导入依赖、配置微信公众号信息、设置配置文件、编写支付相关实体类和API地址常量、实现支付服务以及Controller层的编写,感兴趣的朋友跟随小编一起看看吧
    2024-09-09
  • Springboot 内部服务调用方式

    Springboot 内部服务调用方式

    这篇文章主要介绍了Springboot 内部服务调用方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03
  • java基础--JDK SPI概述

    java基础--JDK SPI概述

    SPI是一种服务发现机制,本文就SPI做了详细概述,具有很好的参考价值,希望对小伙伴们有所帮助,感兴趣的朋友一起来参考参考吧
    2021-08-08
  • 如何正确控制springboot中bean的加载顺序小结篇

    如何正确控制springboot中bean的加载顺序小结篇

    这篇文章主要介绍了如何正确控制springboot中bean的加载顺序总结,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-07-07
  • 如何解决java.net.BindException:地址已在使用问题

    如何解决java.net.BindException:地址已在使用问题

    当Zookeeper启动报错“java.net.BindException:地址已在使用”时,通常是因为指定的端口已被其他进程占用,解决这个问题需要按照以下步骤操作:首先,使用命令如lsof -i:2181找到占用该端口的进程号;其次,使用kill命令终止该进程
    2024-09-09

最新评论