常见函数式编程接口有:Function、Consumer、Predicate、Supplier、UnaryOperator等。
1、Function源码如下:
需要实现的只有一个接口: R apply(T var1); 该接口传一个T类型参数,返回一个R类型数据。数据转换可以用这个接口。
另外compose接口接受一个Function参数,最后又构造了一个Function对象。作用是将该Function组合另一个Function(即参数before),然后按照顺序先调用before的apply方法,用其返回值再调用当前Function的apply方法。这样就形成链式调用。
另一个接口andThen, 也是组合Function,构造一个新的Function,按顺序链式调用原来各个Function的apply方法。
测试代码:
static void testFunction() {Function<Integer, String> func = new Function<Integer, Integer>() { // 数据转化。 可组合成链式调用@Overridepublic Integer apply(Integer integer) {return integer + 1;}}.andThen(new Function<Integer, String>() {@Overridepublic String apply(Integer integer) {return "hello " + integer;}});System.out.println(func.apply(9526));}
打印:hello 9527
2、 Consumer接口源码如下:
和Function的区别在于,其accept函数接受一个T类型参数,但没有返回值。说明不关心返回值。Consumer也支持组合,接口andThen可以将多个Consumer组合起来,实现链式调用。代码略。
3、Predicate接口源码如下:
这些接口都返回bool值,可以用于条件判断,支持多个组合起来。调用test方法判断是否满足条件。
测试代码:
static void testPredicate() {Predicate<Integer> predicate = new Predicate<Integer>() {@Overridepublic boolean test(Integer integer) {return integer >= 18;}}.and(new Predicate<Integer>() {@Overridepublic boolean test(Integer integer) {return integer < 30;}});int age = 18;System.out.println(String.format("%d岁的女性是%s", age, predicate.test(age) ? "少女": "小女孩或大龄女性"));}
打印结果如下:
ok
4、Supplier,代码很简单:
public interface Supplier<T> {T get(); }
不传参,用于获取一个T类型数据。
5、UnaryOperator, 继承Function,输入值和输出值都是同样的类型。
总结:除去上面的这些接口介绍,还有BiFunction, BiPredicate接口,类似于Function、Predicate, 但是参数有俩个。链式调用有助于避免代码调用太深,优化代码结构。