Java8常用函数式接口整理
首先我们要明白几个概念,函数式接口、Lambda表达式、高阶函数。
- 函数式接口:
在Java中函数式接口的定义,就是在一个接口中只有一个抽象方法那么这个接口就是函数式接口。但是不包括默认方法(后续有讲解) 、静态方法和与Object类中的重名方法。 - Lambda表达式:
写法:
参数 箭头符号 方法体,
(Object param1,Object param2) -> {sout(param1+param2);}; ,
param1 -> {sout(param1+param2);} ; 如果只有一个参数括号可不写,
param1 -> sout(param1+param2); 如果方法体只有一句话大括号可以buxie,
() -> sout(param1+param2); 没有参数小括号必须写,
参数上可以声明参数类型也可以不声明,JDK可以通过上下文推断出参数的类型,
作用:
Lambda传递一个行为,而不仅仅是一个值。
提升了抽象的层次。
API重用性更好,更加灵。 - 高阶函数:
一个函数的参数或返回值是一个函数,那么他就是一个高阶函数。
自带的函数式接口 java.util.function包下
函数式接口由@FunctionalInterface注解表示
接下来介绍几个常用的函数式接口
- Consumer
他是接受一个参数没有返回值比如说我们常用的forEach方法的参数就是一个consumer接口
Consumer 还提供了一个默认方法
返回一个由Consumer执行,在序列,其次是该操作after操作。 如果执行任何操作抛出异常,它被中继到由操作的调用者。 如果执行此操作抛出一个异常, after操作不会被执行
就是先执行自己的accept方法在执行参数的accept方法 - Funcation
他接受一个参数返回一个结果
提供了两个默认方法
compose
返回一个由函数,首先应用before函数的输入,然后该功能适用于结果。 如果任一功能的评价抛出一个异常,它被传递到由函数的调用者。
andThen
返回一个由函数,这个函数首先适用于它的输入,然后应用after功能的结果。 如果任一功能的评价抛出一个异常,它被传递到由函数的调用者。
示例
3. BiFunction
他是一个传入两个参数 返回一个结果
他有一个默认方法andThen
返回一个由函数,这个函数首先适用于它的输入,然后应用after功能的结果。 如果任一功能的评价抛出一个异常,它被传递到由函数的调用者。
示例
4. BinaryOperator
BinaryOperator他是BiFunction一个扩展限于BiFunction两个参数类型和返回值类型相同
BinaryOperator 提供了两个静态方法
minBy
返回一个BinaryOperator返回根据指定的两个元件的较小的Comparator 。
maxBy
返回一个BinaryOperator返回根据指定的两个元件的更大的Comparator 。
示例
5. Prediceate
传入一个参数返回一个boolean值
Prediceate 提供了三个默认方法
and
返回一个由谓词表示短路逻辑和这个谓词和其他。 当评估由断言,如果断言是false ,那么other谓语不评估。
无论是上游的评估过程中抛出的任何异常都转达给呼叫者; 如果此断言的评价抛出一个异常, other谓词将不进行评估
or
返回一个由谓词表示短路逻辑的OR这个谓词和其他。 当评估由断言,如果断言是true ,那么other谓语不评估。
无论是上游的评估过程中抛出的任何异常都转达给呼叫者; 如果此断言的评价抛出一个异常, other谓词将不进行评估
negate
返回表示这个谓词逻辑否定谓语。
Prediceate 提供了一个静态方法
isEqual
返回的谓词,如果两个测试参数等于根据是Objects.equals(Object, Object) 。
示例
6. Supplier
没有参数得到一个结果
示例