Function接口的使用文档

Function接口的使用文档

参考资料地址1 : Java 8 中 Function 接口使用方法介绍

01 apply方法

Function是一个函数式接口,里面只有一个抽象方法叫做apply R apply(T t):对数据进行处理,然后返回结果。

源码

//T是参数的泛型,R是返回值的泛型
@FunctionalInterface
public interface Function<T, R> {

    /**
     * Applies this function to the given argument.
     *
     * @param t the function argument
     * @return the function result
     */
    R apply(T t);
}

使用示例

    /**
     * apply
     * 对数据进行处理,然后返回结果
     */
    @Test
    public void test0() {
        //
        Function<Integer,String> function=new Function<Integer, String>() {
            @Override
            public String apply(Integer num) {
                return num*8+" 元";
            }
        };
        //美元兑换人民币
        String rmb = function.apply(1);
        System.out.println("兑换后的币值为: "+rmb);
    }
02 compose 方法
  • compose 的使用示例,用于组合逻辑
  • 如果function为一个的规则,那么通过compose就可以制定哪个规则先执行
  • compose是传入的规则先执行,然后将执行后的结果当作参数再传入调用者,调用者再按它的规制处理

源码

default <V> Function<V, R> compose(Function<? super V, ? extends T> before) {
    Objects.requireNonNull(before);
    return (V v) -> apply(before.apply(v));
}

理解: 看源码,传入的function函数先调用apply方法 ,调用者再执行apply方法,参数为前面的执行结果

使用示例

    /**
     * compose 的使用示例,用于组合逻辑
     * 如果function为一个的规则,那么通过compose就可以制定那个规则先执行
     * compose是传入的规则先执行,然后将执行后的结果当作参数再传入调用者,调用者再按他的规制处理
     */
    @Test
    public void test2() {
        Function<Integer, Integer> function1 = s -> s * 5;
        Function<Integer, Integer> function2 = s -> s + 5;
        Function<Integer, Integer> function3 = function2.compose(function1);
        // 先乘5 然后得到的结果再加5
        // (5*5)+5=30
        Integer result = function3.apply(5);
        System.out.println(result);
    }
03 andThen方法

源码

default <V> Function<T, V> andThen(Function<? super R, ? extends V> after) {
    Objects.requireNonNull(after);
    return (T t) -> after.apply(apply(t));
}

使用示例

    /**
     * andThen 的使用示例
     * andThen与compose的原理类似,不过是传入的规则后执行
     */
    @Test
    public void test3() {
        Function<Integer, Integer> function1 = s -> s * 5;
        Function<Integer, Integer> function2 = s -> s + 5;
        Function<Integer, Integer> function3 = function2.andThen(function1);
        // (5+5)*5=50
        Integer result = function3.apply(5);
        System.out.println(result);
    }
04 identity方法

始终返回一个其输入参数的函数。

 static <T> Function<T, T> identity() {
        return t -> t;
    }

使用示例

   /**
     * identity 的使用示例1
     * 用于将list集合转换成以id为key,value为对象本身的map集合
     */
    @Test
    public void test4() {
        List<Stu> list = new ArrayList<>();
        list.add(new Stu(12, "小花"));
        list.add(new Stu(13, "小红"));
        Map<Integer, Stu> map = list.stream().collect(Collectors.toMap(Stu::getId, Function.identity()));
        System.out.println(map);
        //{12=FunctionTest.Stu(id=12, name=小花), 13=FunctionTest.Stu(id=13, name=小红)}
    }

    @Data
    @AllArgsConstructor
    class Stu {
        Integer id;
        String name;
    }
05 实际应用

检查参数

思路: 将每一个检查规制写成function,校验时随意组合即可

 //长度检测
    private static final Function<String, String> lengthCheck = params -> {
        if (params.length() > 100) {
            throw new RuntimeException("Length exceed max limit.");
        }
        return params;
    };

    //参数检测,以逗号隔开,开头和结尾都不能有逗号
    private static final Function<String, String> invalidParamCheck = str -> {
        if (!str.matches("^\\d+(,\\d+)*$")) {
            throw new RuntimeException("is invalid param");
        }
        return str;
    };
    /**
     * 这里的公共方法组合了该类中的基本校验逻辑构成一个复合的逻辑
     */
    public static void checkStringLengthAndPhoneNumber(String string) {
        //先检查长度 后检查是否有效
        invalidParamCheck.compose(lengthCheck).apply(string);
    }
    @Test
    public void test5() {
        checkStringLengthAndPhoneNumber("456,12,45");
    }
posted @ 2022-05-08 16:44  进击的小蔡鸟  阅读(208)  评论(0编辑  收藏  举报