Java8的Function接口学习(compose和andThen)
2017-10-10 13:16
218 查看
Java8增加了函数式编程这一新特性,我这几天也在慢慢学习,现在就来讲讲
由上知道了
代码里面有点注释,当然输出结果为:
前两个输出比较容易理解,就是把参数值赋值到方法里面,再由apply返回的结果输出即可。
主要就是第3,4个的compose和andThen,由于代码里面是很简单两个数学计算,先说明大概流程,估计推一推就懂了。
在compose里面,先执行squared的apply(4)方法,然后再把结果给times2让他去执行16×2的方法。
而andThen恰恰相反,由英文来理解,先后顺序,即先执行times2的apply方法,再把结果执行squared的apply方法。
这样,就能得到最终的结果。
而在最后一个输出中,虽然有compose方法,但是前一个的Function.identity并没有任何方法,因为identity仅仅是返回一个方法,所以也就执行了squared这一个方法而已。
通过上文的分析,大概可以理解Function这个类了,就是一个方法,有种c++里面函数指针的感觉,一个变量可以指向一个方法,并且可以把两个方法组合起来使用(使用compose和andThen),而可以通过identity这个静态方法来获取当前执行的方法。
Function接口。
何为Function接口?
在java8以后的接口可以有接口方法的默认实现了,如下所示,Function接口主要代码及个人整理注释:
/** * 代表这一个方法,能够接受参数,并且返回一个结果 * @since 1.8 */ @FunctionalInterface public interface Function<T, R> { /** * 将参数赋予给相应方法 * * @param t * @return */ R apply(T t); /** * 先执行参数(即也是一个Function)的,再执行调用者(同样是一个Function) */ default <V> Function<V, R> compose(Function<? super V, ? extends T> before) { Objects.requireNonNull(before); return (V v) -> apply(before.apply(v)); } /** * 先执行调用者,再执行参数,和compose相反。 */ 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; } }
由上知道了
Function类的具体代码,里面有四个方法,分别是
apply,
compose,
andThen,
identity,具体的方法注释卸载代码里面了,主要我想在这里敲敲黑板,就是他们的返回值,
apply是R,也就是代表最终返回结果,其他三个都是返回一个
Function,也就是他们借个是可以进行更多的后层嵌套的,类似于建造者模式去生成类的过程。
具体例子
讲的太抽象,确实,这里放出一个具体例子助于理解:public static void main(String[] args) { Function<Integer, Integer> times2 = i -> i*2; Function<Integer, Integer> squared = i -> i*i; System.out.println(times2.apply(4)); System.out.println(squared.apply(4)); System.out.println(times2.compose(squared).apply(4)); //32 先4×4然后16×2,先执行apply(4),在times2的apply(16),先执行参数,再执行调用者。 System.out.println(times2.andThen(squared).apply(4)); //64 先4×2,然后8×8,先执行times2的函数,在执行squared的函数。 System.out.println(Function.identity().compose(squared).apply(4)); //16 }
代码里面有点注释,当然输出结果为:
8 16 32 64 16
前两个输出比较容易理解,就是把参数值赋值到方法里面,再由apply返回的结果输出即可。
主要就是第3,4个的compose和andThen,由于代码里面是很简单两个数学计算,先说明大概流程,估计推一推就懂了。
在compose里面,先执行squared的apply(4)方法,然后再把结果给times2让他去执行16×2的方法。
而andThen恰恰相反,由英文来理解,先后顺序,即先执行times2的apply方法,再把结果执行squared的apply方法。
这样,就能得到最终的结果。
而在最后一个输出中,虽然有compose方法,但是前一个的Function.identity并没有任何方法,因为identity仅仅是返回一个方法,所以也就执行了squared这一个方法而已。
通过上文的分析,大概可以理解Function这个类了,就是一个方法,有种c++里面函数指针的感觉,一个变量可以指向一个方法,并且可以把两个方法组合起来使用(使用compose和andThen),而可以通过identity这个静态方法来获取当前执行的方法。
相关文章推荐
- java8学习之Function与BiFunction函数式接口详解
- 学习笔记5:java 1.8 Predicate,Function,Supplier,Consumer,Comparator,Optional,Stream接口的使用
- java8学习之Lambda表达式继续探讨&Function接口详解
- [学习笔记]java Enumeration接口方法的学习
- JAVA学习【知】接口
- Java学习总结之第七章 接口
- 【Java】学习笔记——接口
- java接口用法学习----------------java菜鸟学飞第一步
- Java学习笔记---15.面向对象编程10-Java中final关键字,抽象类与接口
- Java基础学习笔记(七)Set接口及其实现子类
- Learn Objective‐C,学习笔记04 协议(Java中的接口,c中的纯虚函数)
- Java基础学习笔记(九)Comparable接口、Map接口、泛型
- JAVA学习4——内部类实现接口 未完成
- JAVA学习4——内部类实现接口 未完成
- 学习《详细解析Java中抽象类和接口的区别》笔记
- java学习笔记(五)----super用法,final用法,抽象类,接口
- JAVA学习心得--继承、接口与泛型
- JAVA学习笔记(六)接口
- java接口测试学习计划
- java语言中接口的学习