1、何为Function接口?

在java8以后的接口可以有接口方法的默认实现了,上源代码。

@FunctionalInterface
public interface Function<T, R> {

	//将参数赋予给相应方法,传入T,返回R
    R apply(T t);

	//先执行参数,再执行调用者 两个Function,先执行后面的,再执行前面的
    default <V> Function<V, R> compose(Function<? super V, ? extends T> before) {
        Objects.requireNonNull(before);
        return (V v) -> apply(before.apply(v));
    }

	//先执行调用者,再执行参数,和compose相反。先执行第一个fun1,再接着执行后面的fun2
    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;
    }
}

2、具体例子,上代码

apply 传入字符串,返回一个字符串

    @Test
    //传入参数字符串,返回参数字符串。字符串转大小写
    public void functionApply () {
        String result = typeConvert("wangjiesheng", s -> s.toUpperCase());
        Console.log("function --> {}", result);
        //function --> WANGJIESHENG
    }

    /***
     * @Description: Function apply接口  传入一个参数,返回值一个参数
     * @Author 王结胜 wangjiehseng
     * @Date 2022/10/25 22:45
     */
    public static <R> R typeConvert (String str, Function<String, R> function) {
        R result = function.apply(str);
        return result;
    }

andThen 先执行fun1,再执行fun2

    @Test
    //先将字符串100转换未Integer类型,再Integer + 10得到结果 110
    public void functionAndThen () {
        Integer result = typeConvert("100", s -> Integer.parseInt(s), s2 -> (s2 + 10));
        Console.log("function --> {}", result);
        //function --> 110
    }

    /***
     * @Description: 先执行fun1,再执行fun2 传入参数str
     * @Author 王结胜 wangjiehseng
     * @Date 2022/10/25 22:51
     */
    public static <R> R typeConvert (String str, Function<String, Integer> fun1, Function<Integer, R> fun2) {
        R result = fun1.andThen(fun2).apply(str);
        return result;
    }

compose 先执行fun2,再执行fun1 跟andThen相反

    @Test
    //先执行fun2 100*100 转换为String类型 再执行fun1把String转换为BigDecimal
    public void functionCompose () {
        BigDecimal amount= typeConvert2(100, s -> new BigDecimal(s), s2 -> String.valueOf(s2 * s2));
        Console.log("function --> {}", amount);
        //function --> 10000
    }


    /***
     * @Description: 传入number 先执行fun2 Integer转String 再执行fun1 String 转泛型R
     * @Author 王结胜 wangjiehseng
     * @Date 2022/10/25 23:08
     */
    public static <R> R typeConvert2 (Integer number, Function<String, R> fun1, Function<Integer, String> fun2) {
        R result = fun1.compose(fun2).apply(number);
        return result;
    }

identity 数值为本身 s->s 替换为 Function.identity()

    @Test
    //把List转为Map, s->s 表示map的key值,key的数值为本身,可以简写为
    public void identity () {
        List<String> strings = Arrays.asList("abc", "de");
        //Map<String, Integer> map = strings.stream().collect(Collectors.toMap(s->s, String::length));
        Map<String, Integer> map = strings.stream().collect(Collectors.toMap(Function.identity(), String::length));
        Console.log("function --> {}", map);
        //function --> {de=2, abc=3}
    }

Function函数式接口是java 8非常重要的特性,利用好Function函数可以极大的简化代码。

下面这篇文章中有介绍函数式接口主要分为Supplier供给型函数、Consumer消费型函数、Runnable无参无返回型函数和Function有参有返回型函数。

https://fastjs.cn/archives/函数式接口编程functionalinterface