Java 8 新增函数式接口到底是什么?

从 Java 8 开始便出现了函数式接口(Functional Interface,以下简称FI)

定义为: 如果一个接口只有唯一的一个抽象接口,则称之为函数式接口。为了保证接口符合 FI ,通常会在接口类上添加 @FunctionalInterface 注解。理解了函数式接口可以为 Java 函数式编程打下基础,最终可通过运用函数式编程极大地提高编程效率。

函数式接口 (Functional Interface) 就是一个有且仅有一个抽象方法,但是可以有多个非抽象方法的接口。

函数式接口可以对现有的函数友好地支持 lambda。

JDK 1.8 之前已有的函数式接口:

java.lang.Runnable
java.util.concurrent.Callable
java.security.PrivilegedAction
java.util.Comparator
java.io.FileFilter
java.nio.file.PathMatcher
java.lang.reflect.InvocationHandler
java.beans.PropertyChangeListener
java.awt.event.ActionListener
javax.swing.event.ChangeListener

JDK 1.8 新增加的函数接口:

java.util.function

网上很多教程说新增 4 个函数接口是不对的,java.util.function 它包含了很多类,用来支持 Java的 函数式编程,该包中的函数式接口 43 个,但是最主要的是这四个:

(1)功能性接口:Function<T,R>
(2)断言性接口:Predicate<T>
(3)供给性接口:Supplier<T>
(4)消费性接口:Consumer<T>

详细一点介绍:

函数式接口 参数类型 返回类型 用途
Consumer T void 对类型T参数操作,无返回结果,包含方法 void accept(T t)
Supplier T 返回T类型参数,方法时 T get()
Function T R 对类型T参数操作,返回R类型参数,包含方法 R apply(T t)
Predicate T boolean 断言型接口,对类型T进行条件筛选操作,返回boolean,包含方法 boolean test(T t)

具体的使用:


/*** Java8内置的四大核心函数式接口:* Consumer<T>:消费型接口</T>* Supplier<T>供给型接口</T>* Function<T,R>函数型接口</T,R>* Predicate<T>段言型接口</T>* boolean test(T t)*/public class TestLamda3 {//Consumer<T>@Testpublic void test1(){happy(10000,(m)-> System.out.println("这次消费了"+m+"元"));}public  void happy(double money, Consumer<Double> con){con.accept(money);}//Supplier<T>@Testpublic  void test2(){List<Integer> list=   getNumList(5,()->{return (int)Math.random()*100;});list.forEach(System.out::println);}public List<Integer> getNumList(int num, Supplier<Integer> supplier){List<Integer>  list=new ArrayList<>();for (int i=0; i<num;i++){Integer n=supplier.get();list.add(n);}return  list;}//函数式接口@Testpublic  void test4(){String newStr=strHandle("\t\t\t woshi nide ",(str)->str.trim());System.out.println(newStr);}public  String strHandle(String str,Function<String,String> fun){return fun.apply(str);}//段言型接口;将满足条件的字符串放入集合中@Testpublic void test5(){List<String> list1= Arrays.asList("nihao","hiehei","woai","ni");List<String> list=filterStr(list1,(s)->s.length()>3);for (String s : list) {System.out.println(s);}}public List<String>  filterStr(List<String> list, Predicate<String> pre){List<String> strings=new ArrayList<>();for (String string : list) {if(pre.test(string)){strings.add(string);}}return strings;}
}

全部接口:

序号 接口 & 描述
1 BiConsumer<T,U>

代表了一个接受两个输入参数的操作,并且不返回任何结果

2 BiFunction<T,U,R>

代表了一个接受两个输入参数的方法,并且返回一个结果

3 BinaryOperator<T>

代表了一个作用于于两个同类型操作符的操作,并且返回了操作符同类型的结果

4 BiPredicate<T,U>

代表了一个两个参数的boolean值方法

5 BooleanSupplier

代表了boolean值结果的提供方

6 Consumer<T>

代表了接受一个输入参数并且无返回的操作

7 DoubleBinaryOperator

代表了作用于两个double值操作符的操作,并且返回了一个double值的结果。

8 DoubleConsumer

代表一个接受double值参数的操作,并且不返回结果。

9 DoubleFunction<R>

代表接受一个double值参数的方法,并且返回结果

10 DoublePredicate

代表一个拥有double值参数的boolean值方法

11 DoubleSupplier

代表一个double值结构的提供方

12 DoubleToIntFunction

接受一个double类型输入,返回一个int类型结果。

13 DoubleToLongFunction

接受一个double类型输入,返回一个long类型结果

14 DoubleUnaryOperator

接受一个参数同为类型double,返回值类型也为double 。

15 Function<T,R>

接受一个输入参数,返回一个结果。

16 IntBinaryOperator

接受两个参数同为类型int,返回值类型也为int 。

17 IntConsumer

接受一个int类型的输入参数,无返回值 。

18 IntFunction<R>

接受一个int类型输入参数,返回一个结果 。

19 IntPredicate

接受一个int输入参数,返回一个布尔值的结果。

20 IntSupplier

无参数,返回一个int类型结果。

21 IntToDoubleFunction

接受一个int类型输入,返回一个double类型结果 。

22 IntToLongFunction

接受一个int类型输入,返回一个long类型结果。

23 IntUnaryOperator

接受一个参数同为类型int,返回值类型也为int 。

24 LongBinaryOperator

接受两个参数同为类型long,返回值类型也为long。

25 LongConsumer

接受一个long类型的输入参数,无返回值。

26 LongFunction<R>

接受一个long类型输入参数,返回一个结果。

27 LongPredicate

R接受一个long输入参数,返回一个布尔值类型结果。

28 LongSupplier

无参数,返回一个结果long类型的值。

29 LongToDoubleFunction

接受一个long类型输入,返回一个double类型结果。

30 LongToIntFunction

接受一个long类型输入,返回一个int类型结果。

31 LongUnaryOperator

接受一个参数同为类型long,返回值类型也为long。

32 ObjDoubleConsumer<T>

接受一个object类型和一个double类型的输入参数,无返回值。

33 ObjIntConsumer<T>

接受一个object类型和一个int类型的输入参数,无返回值。

34 ObjLongConsumer<T>

接受一个object类型和一个long类型的输入参数,无返回值。

35 Predicate<T>

接受一个输入参数,返回一个布尔值结果。

36 Supplier<T>

无参数,返回一个结果。

37 ToDoubleBiFunction<T,U>

接受两个输入参数,返回一个double类型结果

38 ToDoubleFunction<T>

接受一个输入参数,返回一个double类型结果

39 ToIntBiFunction<T,U>

接受两个输入参数,返回一个int类型结果。

40 ToIntFunction<T>

接受一个输入参数,返回一个int类型结果。

41 ToLongBiFunction<T,U>

接受两个输入参数,返回一个long类型结果。

42 ToLongFunction<T>

接受一个输入参数,返回一个long类型结果。

43 UnaryOperator<T>

接受一个参数为类型T,返回值类型也为T。

总结

函数式接口 (Functional Interface) 就是一个有且仅有一个抽象方法,但是可以有多个非抽象方法的接口。

函数式接口是为了 lambda 表达式服务,函数式接口的存在是 lambda 表达式出现的前提,lambda 表达式想关于重写了函数式接口中的唯一方法。

Java 8 新增函数式接口到底是什么?相关推荐

  1. java8的函数式接口的好处_浅谈Java 8 新增函数式接口到底是什么

    从 Java 8 开始便出现了函数式接口(Functional Interface,以下简称FI) 定义为: 如果一个接口只有唯一的一个抽象接口,则称之为函数式接口.为了保证接口符合 FI ,通常会在 ...

  2. Java学习笔记——函数式接口

    一.函数式接口概述 函数式接口:有且仅有一个抽象方法的接口. Java中的函数式编程体现就是Lambda表达式,所以函数式接口就是可以适用于 Lambda表达式使用的接口.只有确保接口中有且仅有一个抽 ...

  3. 【java笔记】函数式接口

    [java笔记]函数式编程_m0_52043808的博客-CSDN博客 [java笔记]lambda表达式介绍和使用_m0_52043808的博客-CSDN博客 函数式接口:有且仅有一个抽象方法的接口 ...

  4. java day23【函数式接口】

    第一章 函数式接口 1.1 概念 函数式接口在Java中是指:有且仅有一个抽象方法的接口. 函数式接口,即适用于函数式编程场景的接口.而Java中的函数式编程体现就是Lambda,所以函数式接口就是可 ...

  5. java新特性-函数式接口-作为方法参数-作为方法的返回值-常用函数式接口-Supplier-Consumer-Predicate-Function

    文章目录 函数式接口 概念 函数式接口作为方法参数 函数式接口作为方法的返回值 常用函数式接口 Supplier接口 常用函数式接口 Consumer 函数式接口之 Predicate接口 常用接口之 ...

  6. 【java初学】函数式接口和Stream

    文章目录 函数式接口和Stream 1. 函数式接口 1.1 函数式接口概述 1.2 常用函数式接口 1.3 比较器函数式接口 1.4 消费函数式接口 Consumer 1.5 生产者接口 Suppl ...

  7. Java中的函数式接口

    函数式接口 1. 函数式接口 1.1 概述 如果说一个接口内有且只有一个方法,而且该方法是一个缺省属性为public abstract方法,该接口可以称之为是一个函数式接口.    自定义函数式接口, ...

  8. java 接口的声明和实现 总结_java知识总结(三):函数式接口

    函数式接口:只有一个抽象方法的接口. 函数式接口的特点: 函数式接口有且只有一个抽象方法. 函数式接口中可以有default方法和static方法(jdk8新增).private方法和private ...

  9. JAVA学习笔记 15 - 函数式接口、Lambda表达式和方法引用

    本文是Java基础课程的第十五课.主要介绍在JDK8中,Java引入的部分新特性,包括函数式接口.Lambda表达式和方法引用.这些新特性使得Java能够在按照面向对象思想进行开发的基础上,融合函数式 ...

  10. java 函数式接口

    函数式接口 1. 概念 函数式接口就是一个有且只有一个抽象方法的接口(可以有其他非抽象的方法).函数式接口可以转化Lambda表达式. 2. 使用 2.1 @FunctionalInterface 注 ...

最新文章

  1. linux之sed命令n,N,d,D,p,P,h,H,g,G,x解析
  2. python输出乘法口诀-python以不同方式打印输出九九乘法表
  3. 干货!!!MySQL 大表优化方案(1)
  4. 超详细!使用OpenCV深度学习模块在图像分类下的应用实践
  5. SQL - 将NULL设置为 NOT NULL
  6. 容器编排技术 -- 使用Minikube集群
  7. Spark源码分析之BlockManager通信机制
  8. 云访问安全代理(CASB)行业调研报告 - 市场现状分析与发展前景预测(2021-2027年)
  9. 【python】获取http响应
  10. 挑战程序设计竞赛(第二章:2.1 搜索)
  11. 菜鸟学R语言(组间多重比较)
  12. python 进化树_进化树专题(七)| 进化树与不完全谱系分选
  13. WDS桥接和WDS中继的区别
  14. 自己写的Excel查询小工具,需要的可以拿走
  15. 单细胞文章专列——细胞图谱
  16. C/C++程序员简历
  17. SAMSUNG,三星,N8000升级
  18. php7 开发框架,Lin是一套基于php7.2的全新web框架
  19. [知了堂学习笔记]_牵线Eclipse和Tomcat第一篇 —— 配置Java环境变量安装eclipse
  20. 经典卷积和深度卷积的神经网络

热门文章

  1. (转载)洪磊并不是反叛英雄
  2. b700a怎么连蓝牙_索尼WI-H700耳机蓝牙连接方法
  3. ITA和意大利荣耀与共,助力蓝衣军团欧洲杯决赛战胜英格兰!
  4. 计算机教室科学名言,描写计算机教室的优美句子23条
  5. pipeline离线安装
  6. 本地音乐如何导入apple_如何将自己的音乐添加到Apple Music
  7. 网站服务器iis7.5配置,IIS 7.5 配置伪静态
  8. Linux中删除文件,磁盘空间未释放问题追踪
  9. GitHub下载提速
  10. HTML编辑器UEditor的简单使用