java函数式接口

2019-01-21 10:54:52

什么是函数式接口

java8的亮点是推出了lamdba表达式,还在api中发布了一些内建的函数式接口。


上面是函数式接口的简介和不同的函数式接口的区别,由于本人比较懒,所以没有过多地研究透彻,在这里,介绍一下基本的使用方法,我们以第一个函数式接口Concumer为例,这是一个接收一个对象,没有返回值的方法。
案例呢,就以上篇转为工具类为例。废话不多说了,进入源码环节。

第一步创建一个函数式接口

  1. Consumer<T> methodName=(a->{
  2. > > 在这里,可以写入你想做的事情。
  3. });

第二步调用函数式接口

  1. > > 第一个就是普通的copy类,其实并没有什么用处
  2. public static <T> T convert(Object o, T t) {
  3. BeanUtils.copyProperties(o, t);
  4. return t;
  5. }
  6. > > 这个方法和上面的区别就是多了个Consumer函数式接口参数,并在内部进行调用
  7. public static <T> T convert(Object o, T t, Consumer<T> consumer) {
  8. BeanUtils.copyProperties(o, t);
  9. if (consumer != null)
  10. consumer.accept(t);
  11. return t;
  12. }

如何调用函数式接口呢?,看到上面的方法,针对于Consumer的函数,是通过accept方法进行调用的,而Function函数式接口却是通过apply调用,虽然名字不同,但效果却是一样的,说到这里,其实函数式接口还有一个andThen()方法,参数为一个函数式接口,此方法的意思是首先调用本身的函数方法,然后在调用此方法参数的函数方法。

andThen()方法拓展

先上个此方法的源码

  1. default Consumer<T> andThen(Consumer<? super T> after) {
  2. Objects.requireNonNull(after);
  3. return (T t) -> { accept(t); after.accept(t); };
  4. }

看完源码,如果还不懂,请看以下代码:

  1. Function<Integer, Integer> add=(a)->{
  2. System.out.println("addMethod result:"+(a+=a));
  3. return a;
  4. };
  5. Function<Integer, Integer> pow=(a)->{
  6. a=(int)Math.pow(a.doubleValue(),2.0);
  7. System.out.println("powMethod result:"+a);
  8. return a;
  9. };

调用andThen()方法:

  1. add.andThen(pow).apply(1);

控制台输出如下:

  1. addMethod result: 2
  2. powMethod result: 4.0

simple解析环节

函数式接口和java的AOP切面的不同之处是,切面只能对方法之前和方法之后进行拦截并操作,而函数式接口,能在方法内部任何时机进行调用。


1
4
0

添加评论

正在回复:
取消
0
1
4
0