什么是函数式接口呢?函数式接口是只有一个抽象方法(Object的方法除外),但是可以有多个非抽象方法的接口,它表达的是一种逻辑上的单一功能。

@FunctionalInterface
@FunctionalInterface 注解用来表示该接口是函数式接口。它有助于及早发现函数式接口中出现的或接口继承的不适当的方法声明。
如果接口用该注解来注释,但实际上不是函数式接口,则会在编译时报错。
Consumer
我们一般称之为“消费者”,它表示接受单个输入参数但不返回结果的操作。不同于其它函数式接口,Consumer 预期通过副作用进行操作。
那什么又是副作用呢?说一下我所理解的副作用,副作用其实就是一个函数是否会修改它范围之外的资源,如果有就叫有副作用,反之为没有副作用。比如修改全局变量,修改输入参数所引用的对象等。
1 |
|
正如我们案例中遇到的场景,我们只需要将要执行的逻辑方法当作参数传入 getResponse() 中,然后在该方法中执行 accept() 方法进行消费即可。如果还不理解,我们可以把它转换为匿名内部类的调用方式。
1 | getResponse(dto, response, new Consumer<B>() { |
当调用accept() 方法的时候就会去调用匿名内部类的方法了,也就是我们传入 getResponse() 的逻辑方法。
例子:
1 | public static String get(Pattern pattern, CharSequence content, int groupIndex) { |
1 | public static void get(Pattern pattern, CharSequence content, Consumer<Matcher> consumer) { |
上面get方法使用Consumer函数式接口,不过传入参数不是消费pattern或者content类型,matcher在下面中给出了,从content转化而来,当条件满足时执行result.set(matcher.group(groupIndex));matcher是Matcher m = pattern.matcher(content);产生,这里当consumer.accept(m)满足条件时执行result.set(matcher.group(groupIndex))。
Supplier
我们一般称之为“生产者”,没有参数输入,但是能返回结果,为结果的提供者。
1 |
|
可以举个简单的例子感受下:
1 | Optional<Double> optional = Optional.empty(); |
Function
我把它称为“转换者”,表示接收一个参数通过处理之后返回一个结果的函数。
1 |
|
我们在 lambda 表达式中应用比较多,所以我们来简单演示下:
1 |
|
其中 map 接收的参数就是 Function 类型, item 为传入参数,item.getName() 为返回处理的结果,最后输出结果为
1 | [张三, 李四, 王五] |
Predicate
我们称之为“判断者”,通过接收参数 T 来返回 boolean 的结果。
1 |
|
相信大家在编码过程中经常会遇到该函数式接口,我们举个例子来说一下:
1 | public static void main(String[] args) { |
其中 filter() 的参数为 Predicate 类型的,返回结果为:李四
看到这儿,我们常见的四种函数式接口就已经介绍完了。说实话,函数式接口我已经看过好几遍了,尤其是 Consumer 和 Supplier。当时只是脑子里学会了,没有应用到具体的项目中,下次再遇到的时候还是一脸懵逼,不知道大家有没有这种感受。
所以我们需要总结经验教训,一定要将代码的原理搞懂,然后多敲几遍,争取应用到自己的项目中,提升自己的编码能力。
推荐阅读: