前言

在上一篇Lambda的讲解中我们就提到过函数式接口,比如:Consumer consumer = (s) -> System.out.println(s);其中Consumer就是一个函数式接口。这里是通过Lambda表达式创建了一个函数式接口的对象。如果不知道什么是Lambda,请看《神秘的Lambda》。

函数式接口是什么?

有且只有一个抽象方法的接口被称为函数式接口,函数式接口适用于函数式编程的场景,Lambda就是Java中函数式编程的体现,可以使用Lambda表达式创建一个函数式接口的对象,一定要确保接口中有且只有一个抽象方法,这样Lambda才能顺利的进行推导。

@FunctionalInterface注解

与@Override 注解的作用类似,Java 8中专门为函数式接口引入了一个新的注解:@FunctionalInterface 。该注解可用于一个接口的定义上,一旦使用该注解来定义接口,编译器将会强制检查该接口是否确实有且仅有一个抽象方法,否则将会报错。但是这个注解不是必须的,只要符合函数式接口的定义,那么这个接口就是函数式接口。

static方法和default方法

实在不知道该在哪介绍这两个方法了,所以就穿插在这里了。

static方法:

java8中为接口新增了一项功能,定义一个或者多个静态方法。用法和普通的static方法一样,例如:

public interface Interface {

/**

* 静态方法

*/

static void staticMethod() {

System.out.println("static method");

}

}

注意:实现接口的类或者子接口不会继承接口中的静态方法。

default方法:

java8在接口中新增default方法,是为了在现有的类库中中新增功能而不影响他们的实现类,试想一下,如果不增加默认实现的话,接口的所有实现类都要实现一遍这个方法,这会出现兼容性问题,如果定义了默认实现的话,那么实现类直接调用就可以了,并不需要实现这个方法。default方法怎么定义?

public interface Interface {

/**

* default方法

*/

default void print() {

System.out.println("hello default");

}

}

注意:如果接口中的默认方法不能满足某个实现类需要,那么实现类可以覆盖默认方法。不用加default关键字,例如:

public class InterfaceImpl implements Interface {

@Override

public void print() {

System.out.println("hello default 2");

}

}

在函数式接口的定义中是只允许有一个抽象方法,但是可以有多个static方法和default方法。

自定义函数式接口

按照下面的格式定义,你也能写出函数式接口:

@FunctionalInterface

修饰符 interface 接口名称 {

返回值类型 方法名称(可选参数信息);

// 其他非抽象方法内容

}

虽然@FunctionalInterface注解不是必须的,但是自定义函数式接口最好还是都加上,一是养成良好的编程习惯,二是防止他人修改,一看到这个注解就知道是函数式接口,避免他人往接口内添加抽象方法造成不必要的麻烦。

@FunctionalInterface

public interface MyFunction {

void print(String s);

}

看上图是我自定义的一个函数式接口,那么这个接口的作用是什么呢?就是输出一串字符串,属于消费型接口,是模仿Consumer接口写的,只不过这个没有使用泛型,而是将参数具体类型化了,不知道Consumer没关系,下面会介绍到,其实java8中提供了很多常用的函数式接口,Consumer就是其中之一,一般情况下都不需要自己定义,直接使用就好了。那么怎么使用这个自定义的函数式接口呢?我们可以用函数式接口作为参数,调用时传递Lambda表达式。如果一个方法的参数是Lambda,那么这个参数的类型一定是函数式接口。例如:

public class MyFunctionTest {

public static void main(String[] args) {

String text = "试试自定义函数好使不";

printString(text, System.out::print);

}

private static void printString(String text, MyFunction myFunction) {

myFunction.print(text);

}

}

执行以后就会输出“试试自定义函数好使不”这句话,如果某天需求变了,我不想输出这句话了,想输出别的,那么直接替换text就好了。函数式编程是没有副作用的,最大的好处就是函数的内部是无状态的,既输入确定输出就确定。函数式编程还有更多好玩的套路,这就需要靠大家自己探索了。

java 常用 函数式接口_「java8系列」神奇的函数式接口相关推荐

  1. java8 lambda maplist排序_「java8系列」流式编程Stream

    前言 「Java8系列」神秘的Lambda 「Java8系列」神奇的函数式接口 继上两篇之后,本文已经java8系列的第三篇了.本篇文章比较长,但我希望大家都能认真读完.读不完可以先收藏,在找时间读. ...

  2. golang 接口_「Golang系列」 深入理解Golang Empty Interface (空接口)

    空接口可用于保存任何数据,它可以是一个有用的参数,因为它可以使用任何类型. 要理解空接口如何工作以及如何保存任何类型,我们首先应该理解名称背后的概念. 接口 这是Jordan Oreilli对空接口的 ...

  3. java8堆内存模型_「GC系列」JVM堆内存分代模型及常见的垃圾回收器

    1. 内存分代模型 为什么要说JVM的内存分代模型呢,因为内存分代和垃圾回收器的运行是有关系的. 现在大部分用到的垃圾回收器在逻辑上是分代的,除了G1之外的其他垃圾回收器在逻辑上和物理上都是分代的. ...

  4. 直接请求接口_「软件测试教程」基于postman进行接口测试实战

    一:接口测试前准备 接口测试是基于协议的功能黑盒测试,在进行接口测试之前,我们要了解接口的信息,然后才知道怎么来测试一个接口,如何完整的校验接口的响应值. 那么问题来了,那接口信息从哪里获取呢?常用的 ...

  5. java -jar 指定端口_「Linux命令」-Java程序员需要掌握的10个命令

    作为服务端开发的同学,经常会与linux服务器打交道,一些用的命令必须要掌握. 1.top命令-观察服务端负载情况 top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况 ...

  6. flask中文文档_「Flask系列」 初识Flask

    引子 作者有多年的编程打杂经验,之前一直参与基于Java的各种项目以及产品规划与设计,后因自己创业维持一家小公司,有些项目与产品,想降低开发成本,故在公司内部推行基于Python Flask的后端开发 ...

  7. java list打乱顺序_「collections.shuffle」Collections.shuffle()打乱List - seo实验室

    collections.shuffle java.util.Collections类下有一个静态的shuffle()方法,如下: 1)static void shuffle(List> list ...

  8. java 字符串数组定义_「string数组」string 数组怎么定义 - seo实验室

    string数组 string数组的定义有三种: String arr[] = new String[10]; //创建一个长度为10的String 类型数组. String arr[] = {&qu ...

  9. PHP和ajax请求_「jQuery+PHP」ajax请求以及接口PHP响应教程

    各位客官好,平时我们在开发时,不可避免的会用到Ajax与后台做数据交互,那么今天小编今天就给各位没有用过Ajax的客官以及准备接触的客官讲解一下,并且小编会为大家讲一下请求时的loading层等待以及 ...

最新文章

  1. 10w 行级别数据的 Excel 导入优化记录
  2. Windows魔法堂:解决“由于启动计算机时出现页面文件配置问题.......”
  3. C# 中的委托和事件(转载)
  4. 树莓派:3安装NodeJS
  5. 装水体积c语言,C语言基础之--sizeof()运算符的使用以及注意
  6. python基于svm的异常检测_[scikit learn]:异常检测-OneClassSVM的替代方案
  7. VB6.0动态加载ActiveX控件漫谈[转]
  8. QuantLib 金融计算——QauntLib 入门
  9. 最近win7更新后出现第二次打开IDE(delphi2007)的时候提示无法打开EditorLineEnds.ttr这个文件...
  10. 计算机网络综合布线的发展史,浅析计算机网络综合布线系统设计
  11. 【mysql】触发器的实例详解
  12. pe系统服务器怎么做双盘备份,群晖硬盘版引导二合一启动盘 丢掉U盘小尾巴
  13. Java中9种常见的CMS GC问题分析与解决
  14. javaweb实现即时消息推送功能
  15. 现代软件工程 第一章 【概论】练习与讨论
  16. python中文意思是什么-python是什么意思中文翻译
  17. 阅读《人类简史:从动物到上帝》笔记
  18. 如何使用百度baidu对某个特定网站进行站内搜索/检索
  19. system.invalidoperationexception:“connectionstring 属性尚未初始化。问题的解决方式
  20. sql简单查询和排序分组

热门文章

  1. CSS 字体文本样式
  2. android 自己写挂电话,MTK Android 如何自动挂断电话
  3. 记录一次糟心的appium启动篇
  4. 无意中发现我这个北漂的几张照片
  5. 用 nodejs 做反向代理服务器
  6. C 商人的诀窍 SDUT
  7. #VS C++ 2019# VSC++基础--下载并安装VSC++
  8. MySQL 学生表(Student)、课程表(Course)、成绩表(Score)以及教师信息表(Teacher)
  9. python:sine之舞
  10. 蓝桥杯单片机省赛——第五届(模拟智能灌溉系统)