龙空技术网

Java中的函数式接口

攻城狮Bilbo 623

前言:

此时同学们对“java 函数式接口”可能比较注意,姐妹们都需要学习一些“java 函数式接口”的相关文章。那么小编在网上汇集了一些关于“java 函数式接口””的相关资讯,希望兄弟们能喜欢,同学们一起来了解一下吧!

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.Runnablejava.util.concurrent.Callablejava.security.PrivilegedActionjava.util.Comparatorjava.io.FileFilterjava.nio.file.PathMatcherjava.lang.reflect.InvocationHandlerjava.beans.PropertyChangeListenerjava.awt.event.ActionListenerjavax.swing.event.ChangeListener

在JDK1.8之后新增了java.util.function这个包,用来支持函数式编程,这个包中包含了很多函数式接口。

主要举几个常用的例子:

Consumer<T>表示接受一个类型为T的参数,并且不返回任何结果。

Consumer

返回结果分别是:

hello world5

Supplier<T>表示无参数,返回一个结果,与Consumer<T>相反。

Supplier

返回结果是一个随机的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)

故名思义,判断是否相等。

Pridicate

返回结果分别是:

falsefalsefalsetrue

Function<T, R>接口表示输入T,期望得到R,T和R可以是相同的类型或者不同类型。

包含一个抽象方法R apply(T t);接收参数T,输出参数R。

包含两个默认方法andThen()和compose()方法用来进行组合操作,,可以简单理解为分别是对输出结果和输入再次进行加工操作。

包含一个静态方法static <T> Function<T, T> identity(),这个静态方法仅仅是将输入对象输出。

Function

输出结果分别是:

2s3s2S

主要常见的就是这几类接口,其他的接口基本上都继承自这几个接口,借用一张图,如下:

java.util.function包下的函数式接口

4.总结

在java中我们一般常用的是编程方式属于命令式编程。函数式编程与命令式编程我个人理解区别在于:在命令式编程中我们输入的是参数,方法中包含的是处理过程,而函数式编程中我们输入的是处理过程,也就是说把处理过程作为处理参数传入到方法中,允许把函数本身作为参数传入另一个函数,还允许返回一个函数。

标签: #java 函数式接口 #java 函数式接口详解