JAVA8之函数式编程Funtion接口

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方法,后面还以加,只是没有写出来而已,大家可以自己去尝试一下.

猜你喜欢

转载自blog.csdn.net/ycxzuoxin/article/details/80950931