文章目录
一、函数式接口
函数式接口: 有且只有一个抽象方法的接口,称之为函数式接口。(函数式接口中还可以包含其他非抽象方法,如默认、静态、私有)
Java中函数式接口的体现就是Lambda表达式,Lambda表达式可以当作匿名内部类的“语法糖”
1、函数式接口的定义
2、@FunctionalIntrrface
注解
@FunctionalInterface 的作用:检测接口是不是函数式接口。
- 如果是一个函数式接口,则编译成功
- 如果接口中没有抽象方法或抽象方法的个数大于1个,则编译失败
3、函数式接口的使用
函数式接口的使用:函数式接口可以作为方法的参数和返回值类型来使用
二、函数式编程
Java中的函数式编程,主要通过Lambda表达式和方法引用实现的。
1、Lambda的延迟执行
有些场景的代码执行后,结果不一定会被使用,从而造成性能浪费。而Lambda表达式是延迟执行的,这正好可以作为解决方案,提升性能。
①性能浪费的“日志案例”
具体场景见下面的“日志案例”。日志:可以记录程序运行中的情况,以便项目的监控和优化。
上面代码存在着性能浪费的问题:
- 调用showLog方法, 传递的第二个参数是【拼接好之后的字符串】。
- 该程序是,先把字符串拼接好, 然后调用showLog(),如果传递的日志等级不是1级,那么就不会用【已经拼接好的】字符串了,字符串就白拼接了,这就是性能的浪费。
②使用Lambda优化“日志案例”
Lambda的特点:存在延迟加载
使用Lambda的前提:必须存在函数式接口
上述代码说明:
2、用Lambda作为方法的参数、返回值
- 使用Lambda表达式作为方法参数,其实就是使用函数式接口作为方法参数。(如果方法的参数是一个函数式接口类型,那么就可以使用匿名内部类或者Lambda进行替代)
例如:java.lang.Runnable 接口
就是一个函数式接口,假设有一个startThread 方法
使用该接口作为参数,那么就可以使用Lambda进行传参。这种情况其实和Thread 类的构造方法参数为Runnable 没有本质区别。
- 如果一个方法的返回值类型是一个函数式接口,那么也可以直接返回一个Lambda表达式。
例如:当需要通过一个方法来获取一个java.util.Comparator 接口
类型的对象作为排序器时, 就可以调该方法获取。其中直接return一个Lambda表达式即可。
三、常用的函数式接口
JDK提供了大量常用的函数式接口以丰富Lambda的典型使用场景,它们主要在java.util.function
包中被提供。
1、Supplier接口
java.util.function.Supplier<T> 接口
这个接口只有一个无参的方法: T get() ,作用:用来获取一个泛型参数指定类型的对象数据(就是如果指定泛型是字符串,那么该方法返回的就是字符串类型)
Supplier接口被称之为【生产型接口】(指定接口的泛型是什么类型, 那么接口中的get方法就会生产什么类型的数据)
2、Comsumer接口
java.util.function.Consumer<T>接口
正好与 Supplier接口 相反,是一个消费型接口。
Consumer接口中的抽象方法void accept(T t)
- Consumer中包含抽象方法 void accept(T t),意为消费一个指定泛型的数据。
- Consumer接口是一个消费型接口,泛型指定为什么类型,就可以使用accept方法消费什么类型的数据,具体怎么消费(使用),需要自定义(输出,计算…)
Consumer接口中的默认方法andThen
- 作用:andThen方法,需要两个Comsumer接口,可以把两个Consumer接口组合到一起,再对数据进行消费
例如:(谁写andThen方法前面,谁先消费)
使用:
Consumer接口的练习
3、Predicate接口
java.util.function.Predicate<T>接口
作用:对某种数据类型的数据进行判断,结果返回一个boolean值
Predicate接口中的抽象方法boolean test(T t)
作用——用来对指定数据类型进行判断的方法,符合条件返回true,不符合条件返回false
Predicate接口中默认方法——and方法
Predicate接口的默认方法——or方法
作用跟and方法差不多,不过是 或运算
Predicate接口的默认方法——negate方法,表示取反
练习:信息筛选
4、Function接口
java.util.function.Function<T, R>接口
,作用:用来根据一个类型的数据得到另一个类型的数据,前者T称为前置条件,后者R称为后置条件
Function接口的抽象方法——R apply()
作用:根据类型T的参数获取类型R的结果
使用场景:如将String类型转换为Integer类型
默认方法——andThen方法
作用:用来进行组合操作
使用: