【java】函数式接口

Function<A,B>

Function接口可以通过实现其apply方法,然后为该接口传一段逻辑,以对象的形式保存,需要调用该段逻辑时,即可调出来使用。其中参数AB,是指传入一个A类型的参数返回一个B类型的参数。
见下面代码:

Function<Integer, String> function1 = i -> String.valueOf(i+5);
Function<Integer, Integer> function2 = i -> i*10;
System.out.println(function1.apply(3));
System.out.println("f2.andThen(f1):" + function2.andThen(function1).apply(4));
System.out.println("f1.compose(f2):" + function1.compose(function2).apply(4));

由于java8提供的这些函数式接口都加了@FunctionalInterface注解,让我们可以直接使用lambda表达式来实现这些接口方法,让代码看起来更干净。

  • andThen:是指先执行前面的方法,然后执行后面括号的方法
  • compose:先执行后面括号里的方法,然后执行前面的方法

来看看上面代码的返回输出:

Predicate

断言类接口,返回一个boolean值,可传入一个T类型的参数。可以使用lambda表达式实现,或者实现接口方法test。
见下方代码:

Predicate<Integer> predicate1 = i -> i<10;
System.out.println(predicate1.test(5));
System.out.println(predicate1.test(20));
//反向
Predicate predicate2 = predicate1.negate();
System.out.println("predi2:" + predicate2.test(5));
Predicate predicate3 = predicate1.and(new Predicate<Integer>() {
    @Override
    public boolean test(Integer integer) {
        return false;
    }
});
System.out.println("predi3:" + predicate3.test(5) + " +++ " + predicate3.test(20));

该接口的or和and方法则是将两个断言式接口的判断结果进行与或操作返回一个能得出最终结果的函数方法。
因此上方代码的返回结果为:

true
false
predi2:false
predi3:false +++ false

Consumer

消费类接口,该类型接口不返回数据,仅仅将传入的信息进行消费,其需要实现的方法为accept。
代码:

int [] myArr = new int[5];
Arrays.fill(myArr, 1);
Consumer<int[]> consumer1 = arr -> arr[1]=0;
consumer1.accept(myArr);
System.out.println("Array:" + Arrays.toString(myArr));

输出结果为:

Array:[1, 0, 1, 1, 1]

综上,其实函数式接口就是为了让我们可以将方法定义为一个对象使用,能更方便使用函数方法块,而@FunctionalInterface注解让我们可以使用lambda的形式来实现这些接口,算是简化代码吧。