Java学习之函数式接口
what(是什莫)
函数式接口(Function Interface)指的是有且只有一个抽象方法的接口,但是可以有多个非抽象方法。
函数接口可以用来支持lambda表达式,lambda表达式作为函数接口中抽象方法的具体实现使用
how(怎末做)
接口的创建方式和普通接口类似,不同的是只有一个方法
interface Tes{
void add();
}
可以在接口上加注解@FunctionalInterface强制实行
同时在Java中也提供一系列的接口供使用
接口 | 描述 |
BiConsumer<T,U> | 代表了一个接受两个输入参数的操作,并且不返回任何结果 |
BiFunction<T,U,R> | 代表了一个接受两个输入参数的方法,并且返回一个结果 |
BinaryOperator<T,> | 代表了一个作用于于两个同类型操作符的操作,并且返回了操作符同类型的结果 |
BiPredicate<T,U> | 代表了一个两个参数的boolean值方法 |
BooleanSupplier | 代表了boolean值结果的提供方 |
Consumer<T,> | 代表了接受一个输入参数并且无返回的操作 |
DoubleBinaryOperator | 代表了作用于两个double值操作符的操作,并且返回了一个double值的结果。 |
DoubleConsumer | 代表一个接受double值参数的操作,并且不返回结果。 |
DoubleFunction<R,> | 代表接受一个double值参数的方法,并且返回结果 |
DoublePredicate | 代表一个拥有double值参数的boolean值方法 |
DoubleSupplier | 代表一个double值结构的提供方 |
DoubleToIntFunction | 接受一个double类型输入,返回一个int类型结果 |
DoubleToLongFunction | 接受一个double类型输入,返回一个long类型结果 |
DoubleUnaryOperator | 接受一个参数同为类型double,返回值类型也为double |
Function<T,R> | 接受一个输入参数,返回一个结果。 |
IntBinaryOperator | 接受两个参数同为类型int,返回值类型也为int |
IntConsumer | 接受一个int类型的输入参数,无返回值 |
IntFunction<R,> | 接受一个int类型输入参数,返回一个结果 |
IntPredicate | 接受一个int输入参数,返回一个布尔值的结果 |
IntSupplier | 无参数,返回一个int类型结果 |
IntToDoubleFunction | 接受一个int类型输入,返回一个double类型结果 |
IntToLongFunction | 接受一个int类型输入,返回一个long类型结果 |
IntUnaryOperator | 接受一个参数同为类型int,返回值类型也为int |
LongBinaryOperator | 接受两个参数同为类型long,返回值类型也为long |
LongConsumer | 接受一个long类型的输入参数,无返回值 |
LongFunction<R,> | 接受一个long类型输入参数,返回一个结果 |
LongPredicate | 接受一个long输入参数,返回一个布尔值类型结果 |
LongSupplier | 无参数,返回一个结果long类型的值 |
LongToDoubleFunction | 接受一个long类型输入,返回一个double类型结果 |
LongToIntFunction | 接受一个long类型输入,返回一个int类型结果 |
LongUnaryOperator | 接受一个参数同为类型long,返回值类型也为long |
ObjDoubleConsumer<T,> | 接受一个object类型和一个double类型的输入参数,无返回值 |
ObjIntConsumer<T,> | 接受一个object类型和一个int类型的输入参数,无返回值 |
ObjLongConsumer<T,> | 接受一个object类型和一个long类型的输入参数,无返回值 |
Predicate<T,> | 接受一个输入参数,返回一个布尔值结果 |
Supplier<T,> | 无参数,返回一个结果 |
ToDoubleBiFunction<T,U> | 接受两个输入参数,返回一个double类型结果 |
Supplier<T,> | 无参数,返回一个结果 |
ToDoubleBiFunction<T,U> | 接受两个输入参数,返回一个double类型结果 |
ToDoubleFunction<T,> | 接受一个输入参数,返回一个double类型结果 |
ToIntBiFunction<T,U> | 接受两个输入参数,返回一个int类型结果 |
ToIntFunction<T,> | 接受一个输入参数,返回一个int类型结果 |
ToLongBiFunction<T,U> | 接受两个输入参数,返回一个long类型结果 |
ToLongFunction<T,> | 接受一个输入参数,返回一个long类型结果 |
UnaryOperator<T,> | 接受一个参数为类型T,返回值类型也为T |
其中Consumer<T,>,Function<T,R>,Supplier<T,>,Predicate<T,>是四个核心接口
使用已经创建好的接口配合lambda表达式可以快速实现某些功能,使用方式如下
BiConsumer<Integer,Integer> bc = (a,b) -> System.out.println("hello lambda");
bc.accept(2, 1); // 调用接口中方法
BooleanSupplier bu = () -> true;
System.out.println(bu);;
DoubleToIntFunction dtf = (d) -> (int)d;
System.out.println(dtf.applyAsInt(2.3));
System.out.println(duo.applyAsDouble(2.3));
Supplier sl = () -> true;
System.out.println(sl.get());
why(为什莫)
好处:
1,配合使用lambad表达式
2,以接口作为参数传入方法,针对不同的处理编写不用的实现方式
例如:
public static void main(String args[]){
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9);
// Predicate<Integer> predicate = n -> true
// n 是一个参数传递到 Predicate 接口的 test 方法
// n 如果存在则 test 方法返回 true
System.out.println("输出所有数据:");
// 传递参数 n
eval(list, n->true);
// Predicate<Integer> predicate1 = n -> n%2 == 0
// n 是一个参数传递到 Predicate 接口的 test 方法
// 如果 n%2 为 0 test 方法返回 true
System.out.println("输出所有偶数:");
eval(list, n-> n%2 == 0 );
// Predicate<Integer> predicate2 = n -> n > 3
// n 是一个参数传递到 Predicate 接口的 test 方法
// 如果 n 大于 3 test 方法返回 true
System.out.println("输出大于 3 的所有数字:");
eval(list, n-> n > 3 );
}
public static void eval(List<Integer> list, Predicate<Integer> predicate) {
for(Integer n: list) {
if(predicate.test(n)) {
System.out.println(n + " ");
}
}
}