网站首页 > 基础教程 正文
1. 什么是函数式接口
Java中函数式接口中的定义如下:
函数式接口(Functional Interface)就是一个有且仅有一个抽象方法,但是可以有多个非抽象方法的接口。
需要注意以下几点:
- JDK1.8中接口支持默认方法,默认方法和静态方法都不属于抽象方法,因此,函数式接口可以包含默认方法和抽象方法;
- 接口默认继承java.lang.Object,如果接口显示声明覆盖了Object中方法,也不算抽象方法,例如,toString(),equals()等。
具体参考下面用例:
在上面代码中只有test1()是抽象方法,test2()是默认方法,toString()是接口默认继承java.lang.Object的方法,并显式覆盖了它,不属于抽象方法。
2. 注解FunctionalInterface
@FunctionalInterface是 Java 8 新加入的一种接口,用于指明该接口类型声明是根据 Java 语言规范定义的函数式接口。
这里需要说明的是:
- @FunctionalInterface注解只能标记在"有且仅有一个抽象方法"的接口上。
- 一个接口是不是函数式接口与加不加@FunctionalInterface注解无关;
- 如果一个接口符合"函数式接口"定义,那么加不加该注解都没有影响,加上该注解能够更好地让编译器进行检查。
- 如果编写的不是函数式接口,但是加上了@FunctionalInterface,那么编译器会报错。
3. Java中的函数式接口
JDK中自带了一些函数式接口,主要可以分为两类:
在JDK1.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
在JDK1.8之后新增了java.util.function这个包,用来支持函数式编程,这个包中包含了很多函数式接口。
主要举几个常用的例子:
Consumer<T>表示接受一个类型为T的参数,并且不返回任何结果。
返回结果分别是:
hello world
5
Supplier<T>表示无参数,返回一个结果,与Consumer<T>相反。
返回结果是一个随机的UUID
5db0e962-7c90-4cc4-93b4-e50f09970eff
Predicate<T>主要用于对某种类型的数据进行判断,从而得到一个boolean值结果。
包含一个抽象方法:boolean test(T t);,根据需要实现这个方法自定义判断规则。
三个默认方法:default Predicate<T> and(Predicate<? super T> other)
default Predicate<T> or(Predicate<? super T> other)
default Predicate<T> negate()
分别对应了与或非操作。
还有一个静态方法:
static <T> Predicate<T> isEqual(Object targetRef)
故名思义,判断是否相等。
返回结果分别是:
false
false
false
true
Function<T, R>接口表示输入T,期望得到R,T和R可以是相同的类型或者不同类型。
包含一个抽象方法R apply(T t);接收参数T,输出参数R。
包含两个默认方法andThen()和compose()方法用来进行组合操作,,可以简单理解为分别是对输出结果和输入再次进行加工操作。
包含一个静态方法static <T> Function<T, T> identity(),这个静态方法仅仅是将输入对象输出。
输出结果分别是:
2s
3s
2S
主要常见的就是这几类接口,其他的接口基本上都继承自这几个接口,借用一张图,如下:
4.总结
在java中我们一般常用的是编程方式属于命令式编程。函数式编程与命令式编程我个人理解区别在于:在命令式编程中我们输入的是参数,方法中包含的是处理过程,而函数式编程中我们输入的是处理过程,也就是说把处理过程作为处理参数传入到方法中,允许把函数本身作为参数传入另一个函数,还允许返回一个函数。
- 上一篇: 零代码组态监控系统,轻松配置运行工况
- 下一篇: Java:在Java中使用函数接口
猜你喜欢
- 2024-11-30 Java开发「函数式编程」——Lambda表达式
- 2024-11-30 玩转java8 lambda表达式三之对象方法引用
- 2024-11-30 Java 中的 Supplier:让数据生成更灵活
- 2024-11-30 Java 中的 Predicate:让判断逻辑更清晰灵活
- 2024-11-30 Java8精华-函数式编程(一)读完这篇,你将彻底理解
- 2024-11-30 你知道实现一个JAVA接口有几种方式吗?配合lambda更加意想不到
- 2024-11-30 java8精华-函数式编程-Predicate(四)
- 2024-11-30 巧妙应用 Java 的 Functional Interface:让代码更简洁、更灵活
- 2024-11-30 函数式接口编程真没那么难,简单几行让你的代码更优雅
- 2024-11-30 初窥函数式接口,不会取标题,没有噱头,全是干货
- 最近发表
- 标签列表
-
- jsp (69)
- gitpush (78)
- gitreset (66)
- python字典 (67)
- dockercp (63)
- gitclone命令 (63)
- dockersave (62)
- linux命令大全 (65)
- pythonif (86)
- location.href (69)
- dockerexec (65)
- tail-f (79)
- queryselectorall (63)
- location.search (79)
- bootstrap教程 (74)
- deletesql (62)
- linuxgzip (68)
- 字符串连接 (73)
- html标签 (69)
- c++初始化列表 (64)
- mysqlinnodbmyisam区别 (63)
- arraylistadd (66)
- mysqldatesub函数 (63)
- window10java环境变量设置 (66)
- c++虚函数和纯虚函数的区别 (66)