Java 8 函数式接口

111 阅读4分钟

函数式接口(Functional Interface)就是一个有且仅有一个抽象方法,但是可以有多个非抽象方法的接口。 java8 引入 @FunctionalInterface 注解声明该接口是一个函数式接口。

1.Function<T,R> 和BiFunction<T,U,R>

Function<T,R> :接受一个输入参数,返回一个结果。

BiFunction<T,U,R>:代表了一个接受两个输入参数的方法,并且返回一个结果

Function中源码:

/**
 * 接收一个参数,生成一个结果。
 * @param <T> 函数的输入类型
 * @param <R> 函数的结果类型
 * @since 1.8
 */
@FunctionalInterface
public interface Function<T, R> {

    /**
     * 将该函数应用到给定的参数
     * @param t 函数的参数
     * @return 函数的结果
     */
    R apply(T t);
    
   /**
    * 返回一个组合函数, 首先执行before function的apply方法, 将它的返回作为输入参数再应用当前的function
    */
    default <V> Function<V, R> compose(Function<? super V, ? extends T> before) {
        Objects.requireNonNull(before);
        return (V v) -> apply(before.apply(v));
    }

   /**
    * 返回一个组合函数, 它是先调用当前函数的apply方法, 再将其结果作为输入参数传递给after function调用apply()
    */
    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;
    }
}

Function函数应用:

public class FunctionTest {
    public static void main(String[] args) {

        System.out.println(testFunction(2,i -> i * 2 + 1));
        System.out.println(testBiFunction(2,5,(a,b) -> (a*b) - 1));
    
        //先执行value -> value * 2 >>5*2=10,10-1=9
        System.out.println(testCompose(5, value -> value - 1,value -> value * 2));
        //先执行value -> value - 1 >>5-1=4
        System.out.println(andThen(5, value -> value - 1,value -> value * 2));
    }
    
  
    //Function<Integer,Integer>中第一个Integer表示传进的参数,第二个Integer表示返回的参数类型
    public static int testFunction(int i, Function<Integer,Integer> function) {
        return function.apply(i);
    }
    
    public static int testBiFunction(int a,int b, BiFunction<Integer,Integer,Integer> biFunction) {
        return biFunction.apply(a,b);
    }
    
    public static int testCompose(int a, Function<Integer, Integer> funA, Function<Integer, Integer> funB) {
        return funA.compose(funB).apply(a);
    }
    
    public static int andThen(int a, Function<Integer, Integer> funA, Function<Integer, Integer> funB) {
        return funA.andThen(funB).apply(a);
    }
}

运行结果:

1648622857(1).png

2.Predicate:

功能点:接受一个输入参数,返回一个布尔值结果。

@FunctionalInterface public interface Predicate {

/**
 * 根据给定的参数评估该断言
 * 匹配返回true, 否则false
 */
boolean test(T t);

/**
 * 返回复合Predicate, 当前的Predicate与传入参数的其它Predicate的短路的逻辑与运算
 * 调用and的当前Predicate如果是false或抛出异常, 后者不再计算
 */
default Predicate<T> and(Predicate<? super T> other) {
    Objects.requireNonNull(other);
    return (t) -> test(t) && other.test(t);
}

/**
 * 返回一个逻辑非
 */
default Predicate<T> negate() {
    return (t) -> !test(t);
}

/**
 * 返回复合Predicate, 当前的Predicate与传入参数的其它Predicate的逻辑或运算
 */
default Predicate<T> or(Predicate<? super T> other) {
    Objects.requireNonNull(other);
    return (t) -> test(t) || other.test(t);
}

/**
 * 两个参数是否相等 {@link Objects#equals(Object, Object)}
 */
static <T> Predicate<T> isEqual(Object targetRef) {
    return (null == targetRef)
            ? Objects::isNull
            : object -> targetRef.equals(object);
}}

Predicate函数应用:

public class PredicateTest {

        public static void main(String[] args) {
            List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
            PredicateTest myTest = new PredicateTest();
            // 输出偶数
            List<Integer> conditionResult1=  myTest.conditionFilter(list, item -> item % 2 == 0);
            System.out.println("输出偶数===="+conditionResult1.toString());
            // 输出>5的偶数
            List<Integer> conditionResult2= myTest.conditionFilter(list, item -> item % 2 == 0 && item > 5);
            System.out.println("输出>5的偶数====" +conditionResult2.toString());
            // 输出>5的偶数
            List<Integer> andFilter= myTest.andFilter(list, item -> item % 2 == 0, item -> item > 5);
            System.out.println("输出>5的偶数===="+andFilter.toString());
            // 输出>5或是偶数
            List<Integer> orFilter= myTest.orFilter(list, item -> item % 2 == 0, item -> item > 5);
            System.out.println("输出输出>5或是偶数===="+orFilter.toString());
        }

        public List<Integer> conditionFilter(List<Integer> list, Predicate<Integer> predicate) {
            List<Integer>result=new ArrayList<Integer>();
            for (Integer integer : list) {
                if (predicate.test(integer)) {
                    result.add(integer);
                }
            }
            return result;
        }
       //逻辑与运算
        public List<Integer> andFilter(List<Integer> list, Predicate<Integer> predicate, Predicate<Integer> other) {
            List<Integer> result=new ArrayList<Integer>();
            for (Integer integer : list) {
                if (predicate.and(other).test(integer)) {
                    result.add(integer);
                }
            }
            return result;
        }

      //逻辑或运算
    public List<Integer> orFilter(List<Integer> list, Predicate<Integer> predicate, Predicate<Integer> other) {
        List<Integer> result=new ArrayList<Integer>();
        for (Integer integer : list) {
            if (predicate.or(other).test(integer)) {
                result.add(integer);
            }
        }
        return result;
    }
}

运行结果:

1648622477(1).png

3.Supplier接口

功能点:无参数,返回一个结果 @FunctionalInterface public interface Supplier {

/**
 * Gets a result.
 *
 * @return a result
 */
T get();}

Supplier函数应用:

/**
 * @program: practise-model
 * @description:
 * @author: lbw
 * @create: 2022-03-30 14:49
 **/

public class SupplierTest {

    public static void main(String args[]) {

        Supplier<String> supplier1 = () -> "lbw";   // lambda表达式
        System.out.println(supplier1.get());

        Supplier<Student> supplier = () -> new Student();
        System.out.println(supplier.get().getName());
        // 构造方法引用
        Supplier<Student> supplier23 = Student::new;
        System.out.println(supplier23.get().getAge());


        int[] numbers = {100, 200, 300, 400, 500, -600, -700, -800, -900, -1000};
        int numberMax = arrayMax(
                () -> {
                    int max = numbers[0];
                    for (int number : numbers) {
                        if (max < number) {
                            max = number;
                        }
                    }
                    return max;
                }
        );
        System.out.println("数组中的最大值为:" + numberMax);
    }

    public static Student get(Supplier<Student> supplier) {
        return supplier.get();
    }

    public static Integer arrayMax(Supplier<Integer> integerSupplier) {
        return integerSupplier.get();
    }

    @Data
    @NoArgsConstructor
    public static class Student {

        private String name = "lbw";
        private int age = 30;
    }
}

运行结果:

1648626263(1).png

4.consumer

代表了接受一个输入参数并且无返回的操作

@FunctionalInterface public interface Consumer {

/**
 * 对给定参数执行消费操作。
 *
 * @param t 输入参数
 */
void accept(T t);

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

Consumer函数应用:



public class ConsumerTest {

    public static void main(String[] args) {
        consumerString(s -> System.out.println(s));

        String[] array = {"张三,男", "李四,女", "王五,男"};
        printInfo(
                s -> System.out.print("姓名:" + s.split(",")[0] + ","),
                s -> System.out.println("性别:" + s.split(",")[1] + "。"),
                array
        );
    }

    private static void consumerString(Consumer<String> function) {
        function.accept("Hello");
    }

    private static void printInfo(Consumer<String> one, Consumer<String> two, String[] array) {
        for (String info : array) {
            one.andThen(two).accept(info);
        }
    }
}