java理论基础函数式接口特点示例解析

 更新时间:2022年03月16日 14:02:08   作者:字母哥哥  
这篇文章主要为大家介绍了java理论基础函数式接口特点示例解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

一、函数式接口是什么?

所谓的函数式接口,实际上就是接口里面只能有一个抽象方法的接口。我们上一节用到的Comparator接口就是一个典型的函数式接口,它只有一个抽象方法compare。

只有一个抽象方法?那上图中的equals方法不是也没有函数体么?不急,和我一起往下看!

二、函数式接口的特点

接口有且仅有一个抽象方法,如上图的抽象方法compare

允许定义静态非抽象方法

允许定义默认defalut非抽象方法(default方法也是java8才有的,见下文)

允许java.lang.Object中的public方法,如上图的方法equals。

FunctionInterface注解不是必须的,如果一个接口符合"函数式接口"定义,那么加不加该注解都没有影响。加上该注解能够更好地让编译器进行检查。如果编写的不是函数式接口,但是加上了@FunctionInterface,那么编译器会报错

甚至可以说:函数式接口是专门为lambda表达式准备的,lambda表达式是只实现接口中唯一的抽象方法的匿名实现类。

三、default关键字

顺便讲一下default关键字,在java8之前

接口是不能有方法的实现,所有方法全都是抽象方法

实现接口就必须实现接口里面的所有方法

这就导致一个问题:当一个接口有很多的实现类的时候,修改这个接口就变成了一个非常麻烦的事,需要修改这个接口的所有实现类。

这个问题困扰了java工程师许久,不过在java8中这个问题得到了解决,没错就是default方法

  • default方法可以有自己的默认实现,即有方法体。
  • 接口实现类可以不去实现default方法,并且可以使用default方法。

四、JDK中的函数式接口举例

java.lang.Runnable,

java.util.Comparator,

java.util.concurrent.Callable

java.util.function包下的接口,如Consumer、Predicate、Supplier等

五、自定义Comparator排序

我们自定义一个排序器,实现compare函数(函数式接口Comparator唯一的抽象方法)。返回0表示元素相等,-1表示前一个元素小于后一个元素,1表示前一个元素大于后一个元素。这个规则和java 8之前没什么区别。

下面代码用自定义接口实现类的的方式实现:按照年龄的倒序排序!

employees.sort(new Comparator<Employee>() {
    @Override
    public int compare(Employee em1, Employee em2) {
        if(em1.getAge() == em2.getAge()){
            return 0;
        }
        return em1.getAge() - em2.getAge() > 0 ? -1:1;
    }
});
employees.forEach(System.out::println);

最终的打印结果如下,按照年龄的自定义规则进行排序。

Employee(id=8, age=79, gender=M, firstName=Alex, lastName=Gussin)
Employee(id=7, age=68, gender=F, firstName=Melissa, lastName=Roy)
Employee(id=10, age=45, gender=M, firstName=Naveen, lastName=Jain)
Employee(id=3, age=43, gender=M, firstName=Ricky, lastName=Martin)
Employee(id=4, age=26, gender=M, firstName=Jon, lastName=Lowman)
Employee(id=1, age=23, gender=M, firstName=Rick, lastName=Beethovan)
Employee(id=5, age=19, gender=F, firstName=Cristine, lastName=Maria)
Employee(id=9, age=15, gender=F, firstName=Neetu, lastName=Singh)
Employee(id=6, age=15, gender=M, firstName=David, lastName=Feezor)
Employee(id=2, age=13, gender=F, firstName=Martina, lastName=Hengis)

这段代码如果以lambda表达式简写。箭头左侧是参数,右侧是函数体,参数类型和返回值根据上下文自动判断。如下:

employees.sort((em1,em2) -> {
    if(em1.getAge() == em2.getAge()){
        return 0;
    }
    return em1.getAge() - em2.getAge() > 0 ? -1:1;
});
employees.forEach(System.out::println);

以上就是java理论基础函数式接口特点示例解析的详细内容,更多关于java理论基础函数式接口的资料请关注脚本之家其它相关文章!

相关文章

  • Day16基础不牢地动山摇-Java基础

    Day16基础不牢地动山摇-Java基础

    这篇文章主要给大家介绍了关于Java中方法使用的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-08-08
  • Jersey框架的统一异常处理机制分析

    Jersey框架的统一异常处理机制分析

    初学者往往不清楚java的异常为什么会设计成这个样子,他们通常会对异常只进行简单的处理
    2016-07-07
  • 基于Jenkins搭建.NET Core持续集成环境过程图解

    基于Jenkins搭建.NET Core持续集成环境过程图解

    这篇文章主要介绍了基于Jenkins搭建.NET Core持续集成环境过程图解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-08-08
  • Mybatis Integer类型参数值为0时得到为空的解决方法

    Mybatis Integer类型参数值为0时得到为空的解决方法

    这篇文章主要介绍了Mybatis Integer类型参数值为0时得到为空的解决方法,有需要的朋友们可以学习下。
    2019-08-08
  • 深入理解spring boot 监控

    深入理解spring boot 监控

    今天通过本文给大家介绍关于spring boot 监控的相关知识,引入jar包的实例代码文中也给大家详细介绍,对spring boot 监控相关知识感兴趣的朋友一起看看吧
    2021-10-10
  • 详解JVM的分代模型

    详解JVM的分代模型

    这篇文章主要介绍了JVM的分代模型的相关资料,帮助大家更好的理解和学习Java虚拟机相关知识,感兴趣的朋友可以了解下
    2020-10-10
  • Spring操作JdbcTemplate数据库的方法学习

    Spring操作JdbcTemplate数据库的方法学习

    这篇文章主要为大家介绍了Spring操作JdbcTemplate数据库方法学习,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-05-05
  • idea创建的idea项目时springframework出现红色的原因和解决方法

    idea创建的idea项目时springframework出现红色的原因和解决方法

    当使用 IntelliJ IDEA 创建 Spring Framework 项目时,springframework 出现红色可能是因为相关的 Spring Framework 依赖没有正确加载或项目的配置有问题,本文给大家介绍了一些常见的原因和解决方法,需要的朋友可以参考下
    2023-09-09
  • Java Servlet 运行原理分析

    Java Servlet 运行原理分析

    这篇文章主要介绍了Java Servlet 运行原理分析,帮助大家更好的理解和学习Java Servlet的相关知识,感兴趣的朋友可以了解下
    2020-11-11
  • Java面向对象之继承性的实例代码详解

    Java面向对象之继承性的实例代码详解

    这篇文章主要介绍了Java面向对象之继承性,文中代码简单易懂,可以更好的帮助大家学习,有兴趣的小伙伴快来了解下
    2020-05-05

最新评论