Java 8 新增函数式接口到底是什么?
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 新增函数式接口到底是什么?相关推荐
- java8的函数式接口的好处_浅谈Java 8 新增函数式接口到底是什么
从 Java 8 开始便出现了函数式接口(Functional Interface,以下简称FI) 定义为: 如果一个接口只有唯一的一个抽象接口,则称之为函数式接口.为了保证接口符合 FI ,通常会在 ...
- Java学习笔记——函数式接口
一.函数式接口概述 函数式接口:有且仅有一个抽象方法的接口. Java中的函数式编程体现就是Lambda表达式,所以函数式接口就是可以适用于 Lambda表达式使用的接口.只有确保接口中有且仅有一个抽 ...
- 【java笔记】函数式接口
[java笔记]函数式编程_m0_52043808的博客-CSDN博客 [java笔记]lambda表达式介绍和使用_m0_52043808的博客-CSDN博客 函数式接口:有且仅有一个抽象方法的接口 ...
- java day23【函数式接口】
第一章 函数式接口 1.1 概念 函数式接口在Java中是指:有且仅有一个抽象方法的接口. 函数式接口,即适用于函数式编程场景的接口.而Java中的函数式编程体现就是Lambda,所以函数式接口就是可 ...
- java新特性-函数式接口-作为方法参数-作为方法的返回值-常用函数式接口-Supplier-Consumer-Predicate-Function
文章目录 函数式接口 概念 函数式接口作为方法参数 函数式接口作为方法的返回值 常用函数式接口 Supplier接口 常用函数式接口 Consumer 函数式接口之 Predicate接口 常用接口之 ...
- 【java初学】函数式接口和Stream
文章目录 函数式接口和Stream 1. 函数式接口 1.1 函数式接口概述 1.2 常用函数式接口 1.3 比较器函数式接口 1.4 消费函数式接口 Consumer 1.5 生产者接口 Suppl ...
- Java中的函数式接口
函数式接口 1. 函数式接口 1.1 概述 如果说一个接口内有且只有一个方法,而且该方法是一个缺省属性为public abstract方法,该接口可以称之为是一个函数式接口. 自定义函数式接口, ...
- java 接口的声明和实现 总结_java知识总结(三):函数式接口
函数式接口:只有一个抽象方法的接口. 函数式接口的特点: 函数式接口有且只有一个抽象方法. 函数式接口中可以有default方法和static方法(jdk8新增).private方法和private ...
- JAVA学习笔记 15 - 函数式接口、Lambda表达式和方法引用
本文是Java基础课程的第十五课.主要介绍在JDK8中,Java引入的部分新特性,包括函数式接口.Lambda表达式和方法引用.这些新特性使得Java能够在按照面向对象思想进行开发的基础上,融合函数式 ...
- java 函数式接口
函数式接口 1. 概念 函数式接口就是一个有且只有一个抽象方法的接口(可以有其他非抽象的方法).函数式接口可以转化Lambda表达式. 2. 使用 2.1 @FunctionalInterface 注 ...
最新文章
- linux之sed命令n,N,d,D,p,P,h,H,g,G,x解析
- python输出乘法口诀-python以不同方式打印输出九九乘法表
- 干货!!!MySQL 大表优化方案(1)
- 超详细!使用OpenCV深度学习模块在图像分类下的应用实践
- SQL - 将NULL设置为 NOT NULL
- 容器编排技术 -- 使用Minikube集群
- Spark源码分析之BlockManager通信机制
- 云访问安全代理(CASB)行业调研报告 - 市场现状分析与发展前景预测(2021-2027年)
- 【python】获取http响应
- 挑战程序设计竞赛(第二章:2.1 搜索)
- 菜鸟学R语言(组间多重比较)
- python 进化树_进化树专题(七)| 进化树与不完全谱系分选
- WDS桥接和WDS中继的区别
- 自己写的Excel查询小工具,需要的可以拿走
- 单细胞文章专列——细胞图谱
- C/C++程序员简历
- SAMSUNG,三星,N8000升级
- php7 开发框架,Lin是一套基于php7.2的全新web框架
- [知了堂学习笔记]_牵线Eclipse和Tomcat第一篇 —— 配置Java环境变量安装eclipse
- 经典卷积和深度卷积的神经网络