Java函数式编程之函数式接口

135 阅读3分钟

我正在参加「掘金·启航计划」

1. 概述

这是我参加掘金启航计划的第五篇文章,希望观众老爷们多多支持,并在评论区批评指正! 学习函数式接口将会进一步的帮助我们理解学习 Java8 Stream 流编程,也会让我们的代码更加具有通用性。

什么是函数式接口?

当方法的参数是一个抽象方法的接口时,我们称之为函数接口。JDK 的函数式接口都加上了 @FunctionalInterface 注解进行标识。但是无论是否加上该注解只要接口中只有一个抽象方法,都是函数式接口。之前我们在 lambda 表达式和 Optional 讲述中都大量使用了函数式接口。

@FunctionalInterface 注解的作用:

  • 当我们创建了一个函数式接口时,在该接口上标注该注解,该接口必须添加一个抽象方法,且只能为一个。

注意: Java8 中的默认方法,不计入。

2. 常见的函数式接口

Java 中的所有函数式接口存放在 java.util.function 包下:

  1. Consumer:消费接口

  1. Function 计算转换接口,根据其中的抽象方法的参数列表和返回值类型知道,我们可以在方法中对传入的参数计算或转换,把结果返回。

  1. Predicate 判断接口:根据其中抽象方法的参数列表和返回值类型知道,我们可以在方法中对传入的参数条件判断,返回判断结果。

  1. Supplier 生产型接口:根据其中抽象方法的参数列表和返回值类型知道,我们可以在方法中创建对象,把创建好的对象返回。

3. 函数式接口中常用的默认方法

3.1. Predicate 函数式接口中的默认方法

  1. and 方法,我们在使用 Predicate 接口时候可能需要进行判断条件的拼接,而 and 方法相当于时使用 && 逻辑运算符拼接这两个判断条件。

如打印作家中年龄大于 17 并且姓名的长度大于 1 的作家

相当于由于对两个 Predicate 函数式接口的 test 方法的返回结果再进行逻辑与运算。

  1. negate 方法:相当于对我们的 test 的结果进行取反操作。

比如返回作家年龄不大于 17 的:

  1. or 方法:由于对两个 Predicate 函数式接口的 test 方法的返回结果再进行逻辑或运算。

3.2. Consumer 函数式接口中的默认方法

addThen 方法:相当于我们执行了 accept 方法之后。可以紧接着执行下一个。

如分别输出作家的年龄和姓名:

3.3. Function 函数式接口中的默认方法

  1. andThen 方法:看关键代码 after.apply(apply(t)) 也就是说,先执行第一次apply()的处理,再执行之后的处理 after.apply(),第二次的计算结果是在第一次计算结果基础上进行运算。

如获取作家出版的书籍数量:

  1. compose 方法:看关键代码 apply(before.appy(v)),可以看出与 andThen 方法刚好相反。

4. 总结

我们在实现函数式接口的具体抽象方法时,不一定使用匿名内部类的方式,也可以使用 lambda 表达式,或者方法引用。