新特性 函数式接口

2019-08-19  本文已影响0人  测试员

概述

有且只有一个抽象方法的接口,称之为函数式接口,当然接口中可以包含其它的方法(默认,静态,私有)

定义一个函数式接口

    /**
    * @author Yuan-9826
    * @FunctionalInterface 检验是否是函数式接口的标签
    */
    
    @FunctionalInterface
    public interface FuncDemo1 {
        /**
        * 定义一个抽象方法
        * 这是一个Demo
        */
        public abstract void method();
    }

常用接口

1.接口:supplier<T>【是个生产型接口】

接口方法:T get()

例:

    class LambdaDemo1 {
        public static void main(String[] args) {
            String a = "a";
            String b = "b";
            System.out.println(getString(()-> a+b));
        }
        public static String getString(Supplier<String> function){
            return function.get();
        }
    }

2.接口:Consumer<T>【是个生产型接口】

接口方法:void accept(T t)【抽象方法】

例:

    class LambdaDemo3 {
        public static void main(String[] args) {
            name("GoWin",(String name)->{
                //反转字符串
                System.out.println(new StringBuffer(name).reverse().toString());
                    }
    
            );
        }
    
        public static void name(String name, Consumer<String> str) {
            str.accept(name);
        }
    }
接口方法: andThen【默认方法】

例1:

    class LambdaDemo4 {
        public static void main(String[] args) {
            String str = "AaBbCcDd";
            method(str,
                    (m) -> System.out.println(str.toUpperCase()),
                    (m) -> System.out.println(str.toLowerCase())
                );
    
        }
    
        public static void method(String str, Consumer<String> c1, Consumer<String> c2) {
            c1.andThen(c2).accept(str);
        }
    }

例2:

    class LambdaDemo5 {
        public static void main(String[] args) {
            String[] arr = {"男,张三", "女,李四", "男,王五", "女,赵六,"};
            method(arr, (r) -> {
                System.out.print(r.split(",")[0] + "==");
            }, (r) -> {
                System.out.println(r.split(",")[1]);
            });
        }
    
        public static void method(String[] arr, Consumer<String> c1, Consumer<String> c2) {
            for (String s : arr) {
                c1.andThen(c2).accept(s);
            }
        }
    }

3.接口: Predicate

接口方法:boolean test(T t)【抽象方法】

例:

    class LambdaDemo7 {
        public static void main(String[] args) {
            String a = "abcdefghijklmn";
    //        只有一个参数不用写类型
    //        返回值很简单不用写return
            System.out.println(isLength(a,pre->pre.length()==5));
        }
    
        public static boolean isLength(String str, Predicate<String> pre) {
            return  pre.test(str);
        }
    }
接口方法:boolean and(T t)【默认方法】

例:

    class LambdaDemo8 {//满足所有条件
        public static void main(String[] args) {
            String a = "asdfzxcvqwer";
    
            boolean b = checkLL(a
                    , (str) -> {
                        return str.length() > 1;
                    }
                    , (str) -> {
                        return str.contains("g");
                    }
            );
            System.out.println(b);
        }
    
        private static boolean checkLL(String str, Predicate<String> pre1, Predicate<String> pre2) {
            return pre1.and(pre2).test(str);
    
        }
    }
接口方法:boolean or(T t)【默认方法】

例:

    class LambdaDemo9 {//满足任意条件
        public static void main(String[] args) {
            String a = "asdfzxcvqwer";
    
            boolean b = checkLL(a
                    , (str) -> {
                        return str.length() > 1;
                    }
                    , (str) -> {
                        return str.contains("g");
                    }
            );
            System.out.println(b);
        }
    
        private static boolean checkLL(String str, Predicate<String> pre1, Predicate<String> pre2) {
            return pre1.or(pre2).test(str);
    
        }
    }
接口方法:boolean negate(T t)【默认方法】

例:

    class LambdaDemo10 {
        public static void main(String[] args) {
            //取反
            String like = "like";
            System.out.println(checkLL(like,pre->pre.length()>1));
    
        }
        private static boolean checkLL(String str, Predicate<String> pre){
            return pre.negate().test(str);
        }
    }

3.接口: Function<T,R>

接口方法: R apply(T t)【抽象方法】

例:

    class LambdaDemo11 {
        public static void main(String[] args) {
            String a = "654123";
            Integer ch = change(a, fun -> Integer.parseInt(a));
            System.out.println("ch = " + ch);
        }
    
        public static Integer change(String str,Function<String,Integer> func){
            return func.apply(str);
        }
    }
接口方法: andThen【默认方法】

例:

    class LambdaDemo12 {
        public static void main(String[] args) {
            String s = "13206";
            Integer c = change(s, fuc -> Integer.parseInt(s), fuc -> fuc - 900);
            System.out.println("c = " + c);
        }
    
        public static Integer change(String str,Function<String,Integer> func1,Function<Integer,Integer> func2){
            return func1.andThen(func2).apply(str);
        }
    }
上一篇 下一篇

猜你喜欢

热点阅读