这一部分主要记录了Java函数式接口的使用方法以及常用的函数式接口,函数式接口(Functional Interface)是Java 8对一类特殊类型的接口的称呼。 这类接口只定义了唯一的抽象方法的接口(除了隐含的Object对象的公共方法)。函数是接口是因为Lambda表达式必须要依赖于上下文存在,故此类接口是Lambda表达式(包括方法引用)的一种实现方式。
文章结构分为「函数式接口的概述、函数是接口的使用方式、常用的函数式接口」三个部分。
函数式接口的概述
概念
- 有且仅有一个抽象方法的接口,即可以使用Lambda表达式的接口
- 函数式接口可以用作【参数传递】&【局部变量】
函数式接口标记@FunctionalInterface
(建议加上)
放在接口定义的上方:如果接口是函数式接口,编译通过;如果不是,编译失败
函数式接口的使用方式
函数式接口作为方法的参数(以Runnable()为例)
要求
定义一个类(RunnableDemo),在类中提供两个方法:
一个方法是:startThread(Runnable r) 方法参数Runnable是一个函数式接口
一个方法是:主方法,在主方法中调用startThread方法
1 | public static void main(String[] args) { |
函数式接口作为方法的返回值(以Comparator() 为例)
要求
定义一个类(ComparatorDemo),在类中提供两个方法:
一个方法是:Comparator getComparator() 方法返回值Comparator是一个函数式接口
一个方法是主方法,在主方法中调用getComparator方法
1 | public class ComparatorDemo { |
常用的函数式接口
生产型接口——Supplier
作用
如果我们指定了接口的泛型是什么类型,那么接口中的get方法就会生产什么类型的数据供我们使用。
方法
方法名 | 说明 |
---|---|
T get() | 按照某种实现逻辑(由Lambda表达式实现)返回一个数据 |
示例
案例需求
定义一个类(SupplierTest),在类中提供两个方法
一个方法是:int getMax(Supplier sup) 用于返回一个int数组中的最大值
一个方法是主方法,在主方法中调用getMax方法
1 | public class SupplierTest { |
消费型接口——Consumer
作用
对传入参数执行或依次执行操作,它消费的数据的数据类型由泛型指定
方法
方法名 | 说明 |
---|---|
void accept(T t) | 对给定的参数执行此操作 |
default Consumer andThen(Consumer after) | 返回一个组合的Consumer,依次执行此操作,然后执行after操作 采用链式编程 |
示例
案例需求
String[] strArray = {“林青霞,30”, “张曼玉,35”, “王祖贤,33”};
字符串数组中有多条信息,请按照格式:“姓名:XX,年龄:XX”的格式将信息打印出来
要求
把打印姓名的动作作为第一个Consumer接口的Lambda实例
把打印年龄的动作作为第二个Consumer接口的Lambda实例
将两个Consumer接口按照顺序组合到一起使用
代码实现
1 | public class ConsumerTest { |
判断用接口——Predicate
作用
Predicate接口通常用于判断参数是否满足指定的条件
方法
方法名 | 说明 |
---|---|
boolean test(T t) | 对给定的参数进行判断(判断逻辑由Lambda表达式实现),返回一个布尔值 |
default Predicate negate() | 返回一个逻辑的否定,对应逻辑非 |
default Predicate and(Predicate other) | 返回一个组合判断,对应短路与 |
default Predicate or(Predicate other) | 返回一个组合判断,对应短路或 |
示例
练习描述
String[] strArray = {“林青霞,30”, “柳岩,34”, “张曼玉,35”, “貂蝉,31”, “王祖贤,33”};
字符串数组中有多条信息,请通过Predicate接口的拼装将符合要求的字符串筛选到集合ArrayList中,并遍历ArrayList集合
同时满足如下要求:
姓名长度大于2;年龄大于33
分析
- 有两个判断条件,所以需要使用两个Predicate接口,对条件进行判断
- 必须同时满足两个条件,所以可以使用and方法连接两个判断条件
代码实现
1 | public class PredicateTest { |
数据处理返回用接口——Function
作用
Function<T,R>接口通常用于对参数进行处理,转换(处理逻辑由Lambda表达式实现),然后返回一个新的值。转换前的数据类型是 T ,转换后的数据类型是 R 。
方法
方法名 | 说明 |
---|---|
R apply(T t) | 将此函数应用于给定的参数 |
default Function andThen(Function after) | 返回一个组合函数,首先将该函数应用于输入,然后将after函数应用于结果 |
示例
- 练习描述
- String s = “林青霞,30”;
请按照我指定的要求进行操作: - 1:将字符串截取得到数字年龄部分
2:将上一步的年龄字符串转换成为int类型的数据
3:将上一步的int数据加70,得到一个int结果,在控制台输出 - 请通过Function接口来实现函数拼接
- String s = “林青霞,30”;
- 代码实现
1 | public class FunctionTest { |