1. 介绍
函数式接口,我们只看后缀,它就是个接口,区别就是它只有一个抽象的方法,并且在实例化这个接口时,我们可以用lambda表达式来表示,或是更简洁的方法引用。
2. 分类
函数式接口主要分为以下4大类:
1)Function 正常函数,一个入参,一个出参
还有一些常用的函数接口
BiFunction<T,U,R> 两个入参,一个出参
DoubleFunction<R> 一个double入参,一个出参
DoubleToIntFunction 一个double入参,一个int出参
DoubleToLongFunction 一个double入参,一个long出参
IntFunction<R> 一个int入参,一个出参
IntToDoubleFunction 一个int入参,一个double出参
IntToLongFunction 一个int入参,一个long出参
LongFunction<R> 一个long入参,一个出参
LongToDoubleFunction 一个long入参,一个double出参
LongToIntFunction 一个long入参,一个int出参
ToDoubleBiFunction<T,U> 两个入参,double出参
ToDoubleFunction<T> 一个入参,double出参
ToIntBiFunction<T,U> 两个入参,一个int出参
ToIntFunction<T> 一个入参,一个int出参
2)Consumer 消费,一个入参
BiConsumer<T,U> 两个入参,无出参
DoubleConsumer double入参,无出参
IntConsumer int入参,无出参
LongConsumer long入参,无出参
3)Supplier 生产,无参,一个出参
BooleanSupplier 无入参,boolean出参
DoubleSupplier 无入参,double出参
IntSupplier 无入参,int出参
LongSupplier 无入参,long出参
4)Predicate 预示 一个入参,布尔出参
BiPredicate<T,U> 两个入参,boolean出参
DoublePredicate double入参,boolean出参
IntPredicate int入参,boolean出参
LongPredicate long入参,boolean出参
3.示例
package basic;
import java.util.function.BiFunction;
public class FunctionTest {
static class Car {
public static void drive(BiFunction bi) {
System.out.println(bi.andThen(a->{return a+" 去旅行了!";}).apply("司机甲", "汽车乙"));
}
}
public static void main(String[] args) {
Car.drive((a,b)->{return a+" 驾驶着 "+b;});
}
}
//输出
司机甲 驾驶着 汽车乙 去旅行了!
这里面有一个BiFunction的andThen方法,可以先看一下源码:
default <V> BiFunction<T, U, V> andThen(Function<? super R, ? extends V> after) {
Objects.requireNonNull(after);
return (T t, U u) -> after.apply(apply(t, u));
}
这里可以看到,先执行2个参数的apply方法,把这个结果作为入参再执行Function方法,
也就是说,调用完andThen方法后,得到了一个新的组合的BiFunction函数接口,这时并没有开始执行,
到.apply("司机甲", "汽车乙")方法时,开始真正执行。-_-