JAVA8 Function<T,R> 和 BiFunction<T,U,R> 接口

Function是一个函数接口,接受一个输入参数,返回一个结果,是JDK 1.8 新增加的函数式接口。

public interface Function<T, R> {

    /**
     * 将此函数应用于给定参数
     * 真正执行函数接口的方法
     */
    R apply(T t);

    /**
     * 函数链,before执行的结果做根函数为参数
     */
    default <V> Function<V, R> compose(Function<? super V, ? extends T> before) {
        Objects.requireNonNull(before);
        return (V v) -> apply(before.apply(v));
    }

    /**
     * 函数链,根函数执行结果做为after的参数
     */
    default <V> Function<T, V> andThen(Function<? super R, ? extends V> after) {
        Objects.requireNonNull(after);
        return (T t) -> after.apply(apply(t));
    }

    /**
     * 返回一个参数做为返回值的函数
     */
    static <T> Function<T, T> identity() {
        return t -> t;
    }
}

看注释有些绕,还是看例子

//例1
public class FunctionDemo {
    public static void main(String[] args) {
        Function<Integer,Integer> root = (v) -> {
            System.out.println("root apply");
            return v + 1;// 12
        };
        Function<Integer,Integer> before = (v) -> {
            System.out.println("before apply");
            return v + 1;// 先得结果11,再传给root
        };

        System.out.println(root.compose(before).apply(10));
        // before apply
        // root apply
        // 12
    }
}
//例2
public class FunctionDemo {
    public static void main(String[] args) {
        Function<Integer,Integer> root = (v) -> {
            System.out.println("root apply");
            return v + 1;// 先得结果11,再传给after
        };
        Function<Integer,Integer> after = (v) -> {
            System.out.println("after apply");
            return v + 1;// 12
        };

        System.out.println(root.andThen(after).apply(10));
        // root apply
        // after apply
        // 12
    }
}

 例1和例2虽然参数一样,结果一样,但是相对与根函数root执行的顺序一个在前,一个在后。

Function与Consumer接口都有andThen方法,两者的区别是对参数的使用方式不同。每Consumer使用的是同一个原始参数,Function的参数只会被根函数使用一次,之后的函数使用的是前一个函数的结果做为参数。

了解了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类型结果。

ToLongBiFunction<T,U>:接受两个输入参数,返回一个long类型结果。

ToLongFunction<T>:接受一个输入参数,返回一个long类型结果。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值