JAVA8之函数式编程Funtion接口
从这章开始,会介绍几个常用的函数式接口工具,首先先来看下这个大家族:
首先从Function接口开始介绍
一. 概述
该接口顾名思义,函数的意思,就像是数学,是给定一个参数然后返回结果.该类方法如下:
package java.util.function;
import java.util.Objects;
@FunctionalInterface
public interface Function<T, R> {
R apply(T t);
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));
}
static <T> Function<T, T> identity() {
return t -> t;
}
1. apply方法
该接口的唯一个抽象类是apply方法,接受一个类型的参数,有返回值.功能是将参数赋予相应的方法.
2. compose方法
默认方法,先用入参去调用apply方法,然后再用调用者去调用apply方法.调用的Object.requireNonNull是java7的新特性,如果before是null值的话直接抛出异常.
3. andThen方法
默认方法,与compose方法相反,先用调用者去调用apply方法,然后再用入参去调用apply方法.
4. identity方法
静态方法,java8新特性,返回当前正在执行的方法.
二. 示例
不难看出,除了第一个方法以外,其他三个方法的返回值都是Function,所以后面三个方法是可以链式调用(即用"."方法)的,就如建造者模式(Build)一样.理论讲完,上代码:
package com.yczuoxin.demo;
import java.util.function.Function;
public class FunctionTest {
public static void main(String[] args) {
// 先声明方法
Function<Integer, Integer> funcDouble = (n) -> n * 2;
Function<Integer, Integer> funcPlus2 = (n) -> n + 2;
System.out.println(funcDouble.apply(3));
System.out.println(funcPlus2.apply(3));
System.out.println(funcDouble.andThen(funcPlus2).apply(3));
System.out.println(funcDouble.compose(funcPlus2).apply(3));
System.out.println(Function.identity().compose(funcDouble).apply(8));
}
}
运行结果:
把计算过程也写在上面应该就能知道执行顺序了吧.
三. 总结
这个工具类感觉就是回到了学数学的场景,自己规定函数,然后调用函数,其实不仅仅可以调用一次andThen方法,后面还以加,只是没有写出来而已,大家可以自己去尝试一下.