专业编程基础技术教程

网站首页 > 基础教程 正文

Java中的函数式接口

ccvgpt 2024-11-30 19:16:59 基础教程 8 ℃

1. 什么是函数式接口

Java中函数式接口中的定义如下:

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

Java中的函数式接口

需要注意以下几点:

  1. JDK1.8中接口支持默认方法,默认方法和静态方法都不属于抽象方法,因此,函数式接口可以包含默认方法和抽象方法;
  2. 接口默认继承java.lang.Object,如果接口显示声明覆盖了Object中方法,也不算抽象方法,例如,toString(),equals()等。

具体参考下面用例:

在上面代码中只有test1()是抽象方法,test2()是默认方法,toString()是接口默认继承java.lang.Object的方法,并显式覆盖了它,不属于抽象方法。

2. 注解FunctionalInterface

@FunctionalInterface是 Java 8 新加入的一种接口,用于指明该接口类型声明是根据 Java 语言规范定义的函数式接口。

这里需要说明的是:

  1. @FunctionalInterface注解只能标记在"有且仅有一个抽象方法"的接口上。
  2. 一个接口是不是函数式接口与加不加@FunctionalInterface注解无关;
  3. 如果一个接口符合"函数式接口"定义,那么加不加该注解都没有影响,加上该注解能够更好地让编译器进行检查。
  4. 如果编写的不是函数式接口,但是加上了@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中我们一般常用的是编程方式属于命令式编程。函数式编程与命令式编程我个人理解区别在于:在命令式编程中我们输入的是参数,方法中包含的是处理过程,而函数式编程中我们输入的是处理过程,也就是说把处理过程作为处理参数传入到方法中,允许把函数本身作为参数传入另一个函数,还允许返回一个函数。

最近发表
标签列表