架构师_程序员_码农网

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 10169|回复: 1

[资料] Java 常用函数式接口(委托)详解

[复制链接]
发表于 2021-9-16 09:28:21 | 显示全部楼层 |阅读模式
JDK 1.8 API包含了很多内建的函数式接口,在老Java中常用到的比如Comparator或者Runnable接口,这些接口都增加了@FunctionalInterface注解以便能用在lambda上。现如今,我们则从Function常用函数入口,真正了解一下。

nametypedescription
ConsumerConsumer< T >接收T对象,不返回值
PredicatePredicate< T >接收T对象并返回boolean
FunctionFunction< T, R >接收T对象,返回R对象
SupplierSupplier< T >提供T对象(例如工厂),不接收值
UnaryOperatorUnaryOperator接收T对象,返回T对象
BinaryOperatorBinaryOperator接收两个T对象,返回T对象


标注为FunctionalInterface的接口被称为函数式接口,该接口只能有一个自定义方法,但是可以包括从object类继承而来的方法。如果一个接口只有一个方法,则编译器会认为这就是一个函数式接口。是否是一个函数式接口,需要注意的有以下几点:


  • 该注解只能标记在”有且仅有一个抽象方法”的接口上。
  • JDK8接口中的静态方法和默认方法,都不算是抽象方法。
  • 接口默认继承java.lang.Object,所以如果接口显示声明覆盖了Object中方法,那么也不算抽象方法。
  • 该注解不是必须的,如果一个接口符合”函数式接口”定义,那么加不加该注解都没有影响。加上该注解能够更好地让编译器进行检查。如果编写的不是函数式接口,但是加上了@FunctionInterface,那么编译器会报错。
  • 在一个接口中定义两个自定义的方法,就会产生Invalid ‘@FunctionalInterface’ annotation; FunctionalInterfaceTest is not a functional interface错误.


java.util.function 它包含了很多类,用来支持 Java的 函数式编程,该包中的函数式接口有:

序号
接口 & 描述
1BiConsumer<T,U>
代表了一个接受两个输入参数的操作,并且不返回任何结果
2BiFunction<T,U,R>
代表了一个接受两个输入参数的方法,并且返回一个结果
3BinaryOperator<T>
代表了一个作用于于两个同类型操作符的操作,并且返回了操作符同类型的结果
4BiPredicate<T,U>
代表了一个两个参数的boolean值方法
5BooleanSupplier
代表了boolean值结果的提供方
6Consumer<T>
代表了接受一个输入参数并且无返回的操作
7DoubleBinaryOperator
代表了作用于两个double值操作符的操作,并且返回了一个double值的结果。
8DoubleConsumer
代表一个接受double值参数的操作,并且不返回结果。
9DoubleFunction<R>
代表接受一个double值参数的方法,并且返回结果
10DoublePredicate
代表一个拥有double值参数的boolean值方法
11DoubleSupplier
代表一个double值结构的提供方
12DoubleToIntFunction
接受一个double类型输入,返回一个int类型结果。
13DoubleToLongFunction
接受一个double类型输入,返回一个long类型结果
14DoubleUnaryOperator
接受一个参数同为类型double,返回值类型也为double 。
15Function<T,R>
接受一个输入参数,返回一个结果。
16IntBinaryOperator
接受两个参数同为类型int,返回值类型也为int 。
17IntConsumer
接受一个int类型的输入参数,无返回值 。
18IntFunction<R>
接受一个int类型输入参数,返回一个结果 。
19IntPredicate
:接受一个int输入参数,返回一个布尔值的结果。
20IntSupplier
无参数,返回一个int类型结果。
21IntToDoubleFunction
接受一个int类型输入,返回一个double类型结果 。
22IntToLongFunction
接受一个int类型输入,返回一个long类型结果。
23IntUnaryOperator
接受一个参数同为类型int,返回值类型也为int 。
24LongBinaryOperator
接受两个参数同为类型long,返回值类型也为long。
25LongConsumer
接受一个long类型的输入参数,无返回值。
26LongFunction<R>
接受一个long类型输入参数,返回一个结果。
27LongPredicate
R接受一个long输入参数,返回一个布尔值类型结果。
28LongSupplier
无参数,返回一个结果long类型的值。
29LongToDoubleFunction
接受一个long类型输入,返回一个double类型结果。
30LongToIntFunction
接受一个long类型输入,返回一个int类型结果。
31LongUnaryOperator
接受一个参数同为类型long,返回值类型也为long。
32ObjDoubleConsumer<T>
接受一个object类型和一个double类型的输入参数,无返回值。
33ObjIntConsumer<T>
接受一个object类型和一个int类型的输入参数,无返回值。
34ObjLongConsumer<T>
接受一个object类型和一个long类型的输入参数,无返回值。
35Predicate<T>
接受一个输入参数,返回一个布尔值结果。
36Supplier<T>
无参数,返回一个结果。
37ToDoubleBiFunction<T,U>
接受两个输入参数,返回一个double类型结果
38ToDoubleFunction<T>
接受一个输入参数,返回一个double类型结果
39ToIntBiFunction<T,U>
接受两个输入参数,返回一个int类型结果。
40ToIntFunction<T>
接受一个输入参数,返回一个int类型结果。
41ToLongBiFunction<T,U>
接受两个输入参数,返回一个long类型结果。
42ToLongFunction<T>
接受一个输入参数,返回一个long类型结果。
43UnaryOperator<T>
接受一个参数为类型T,返回值类型也为T。


理解的 Java 中的函数式接口就是 .NET/C# 中的委托,将方法当作参数传递,如下:

C#委托的介绍(delegate、Action、Func、predicate)
https://www.itsvse.com/thread-4658-1-1.html

Function常用方法&&实践

//将Function对象应用到输入的参数上,然后返回计算结果。
R apply(T t);

虽然 Function< T, R > 接收T对象,返回R对象,只有一个接收和返回对象,但是结合元组,可以做到多个传入值和返回值,参考:


例子一:传递两个数值,求和

可以使用普通写法和lambda表达式的写法,代码如下:



QQ截图20210916092231.jpg

例子二:

andThen方法



compose方法



完整代码



返回结果



(完)




上一篇:Java FeignClient 多个相同服务名称的接口异常解决方案
下一篇:maven 项目 \target\classes\META-INF\MANIFEST.MF (系统...
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
发表于 2021-9-19 19:34:22 | 显示全部楼层
java的也看看,虽然用不到
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

免责声明:
码农网所发布的一切软件、编程资料或者文章仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。

Mail To:help@itsvse.com

QQ|手机版|小黑屋|架构师 ( 鲁ICP备14021824号-2 )|网站地图

GMT+8, 2024-4-24 10:26

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表