Java8-Function

我们仔细看一下源码:

@FunctionalInterface
public interface Function<T, R> {
}

第一部分:接口声明,使用了@FunctionalInterface注解,此注解标注了Function接口为函数式接口(函数式接口就是只能有一个抽象方法),此注解跟@override类似,仅仅作为一个提示和编译检查的作用,也可以省略不写。

R apply(T t);

第二部分:接口中唯一的抽象方法apply,将function对象应用到输入的参数上,并且输出结果

default <V> Function<V, R> compose(Function<? super V, ? extends T> before) {
        Objects.requireNonNull(before);
        return (V v) -> apply(before.apply(v));
    }


default <V> Function<T, V> andThen(Function<? super R, ? extends V> after) {
        Objects.requireNonNull(after);
        return (T t) -> after.apply(apply(t));
    }

第三部分:compose方法和addThen方法,可以看到这2个方法内部的执行结构是一样的,仅仅执行顺序不同。

compose方法先执行输入参数的apply,再执行当前对象的apply。

addThen方法先执行当前对象的apply,再执行输入参数的apply。

举例说明:

public class TestFunction {
    public static void main(String[] args) {
        Function<Integer,Integer> function = t->t*2;
        Function<Integer,Integer> function1 = t->t*t;
        int value = function.andThen(function).apply(4);
        int value1 = function1.compose(function1).apply(4);
        int value2 = function.andThen(function1).apply(4);
        int value3 = function1.compose(function).apply(4);
        int value4 = function.compose(function).apply(4);
        int value5 = function.compose(function1).apply(4);
        int value6 = function1.andThen(function).apply(4);
        int value7 = function1.andThen(function1).apply(4);
        System.out.println("value = : "+value);
        System.out.println("value1 = : "+value1);
        System.out.println("value2 = : "+value2);
        System.out.println("value3 = : "+value3);
        System.out.println("value4 = : "+value4);
        System.out.println("value5 = : "+value5);
        System.out.println("value6 = : "+value6);
        System.out.println("value7 = : "+value7);
    }
}

运行结果:

value = : 16
value1 = : 256
value2 = : 64
value3 = : 64
value4 = : 16
value5 = : 32
value6 = : 32
value7 = : 256

对于value2的值,计算步骤是先计算4*2=8,再计算8*8=64.

而对于value5的值,先计算4*4=16,再计算16*2=32.其他的值以此类推。

static <T> Function<T, T> identity() {
        return t -> t;
    }

第四部分:identity,返回一个总是返回其输入参数的方法

 

对于函数式接口,有如下示例:

public interface AddOK<T,S> {
    public S addOK(T t);
}

接下来:

        AddOK<Integer,String> addOK = t->t+"OK";
        String ss = addOK.addOK(888);
        System.out.println(ss);

结果:

888OK

可以简单理解为:t->t+"OK" 是 重写addOK的方法体,不必像以前那样需要写一个类实现接口,然后在类中重写addOK方法,代码变得十分简单。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值