Java基础篇--函数式接口

一、函数式接口概述:

1.函数式接口:有且仅有一个抽象方法的接口,java中的函数式编程体现就是Lambda表达式,所以函数式接口就是可以适用于Lambda使用的接口,只有确保接口有且仅有一个抽象方法,java中的Lambda才能顺利的进行推导

二、如何检测一个接口是不是函数式接口呢?

1.@FunctionalInterface

2.放在接口定义的上方:如果接口是函数式接口,编译通过;如果不是,编译失败

@FunctionalInterface
public interfaceSum {
    void show();
}

三、注意:

1.我们自己定义函数式接口时候,@FunctionalInterface是可选的,就算我不写这个注解,只要保证满足函数式接口定义条件, 也照样是函数式接口。但是,建议加上该注解

四、函数式接口作为方法的参数: 

1.如果方法的参数提供是一个函数式接口,我们可以使用Lambda表达式做为参数传递

startThread(() -> System.out.println(Thread.currentThread().getName()+"线程启动"))

 五、函数式接口作为方法的返回值:

1.如果返回值是一个函数式接口,我们可以使用Lambda表示作为结果返回

private static Comparator getComparator(){
        return (s1,s2) -> s1.length()-s1.length();
    }

 六、常用的函数式接口:

1.Supplier接口

2.Consumer接口

3.Predicate接口

4.Function接口

七 、Supplier接口:

1.Supplier:包含一个无参的方法

2.T get():获得结果

3.该方法不需要参数,它会按照某种实现逻辑(由Lambda表达式实现)返回一个数据

4.Supplier接口也被称为生产型接口,如果我们指定了接口的泛型是什么类型,那么接口中的get方法就会生产什么类型的数据供我们使用

 private static String getString(Supplier s){
        return s.get();
    }
    private static Integer getInteger(Supplier i){
        return i.get();
    }

 八、Consumer接口:

1.Consumer:包含两个方法

2.void accept(T t):对给定的参数执行操作

3.default Consumer andThen(Consumer after):返回一个组合的Consumer,依次执行操作,然后执行after操作

4.Consumer接口也被称为消费型接口,它消费的数据类型由泛型指定

 public static void main(String[] args) {
        operatorString("亚瑟",(String s) -> System.out.println(s));
        operatorString("貂蝉",s -> System.out.println(s));
        operatorString("安其拉",System.out::println);
        operatorString("安其拉",(String s) -> {
            System.out.println(new StringBuilder(s).reverse().toString());
        });
        operatorString("貂蝉",s -> System.out.println(new StringBuilder(s).reverse().toString()));
        operatorString("成吉思汗",s -> System.out.println(s),s1 -> System.out.println(new StringBuilder(s1).reverse().toString()));
    }
    //定义一个方法,用不同的方式消费同一个字符串数据两次
    private static void operatorString(String name,Consumer con,Consumer con1){
//        con.accept(name);
//        con1.accept(name);
        con.andThen(con1).accept(name);
    }
    //定义一个方法,消费一个字符串数据
    private static void operatorString(String name, Consumer con){
        con.accept(name);
    }

 九、Predicate接口:

1.Predicate:常用的四个方法

2.boolean test(T t):对给定的参数进行判断(判断逻辑由Lambda表达式实现),返回一个布尔值

3.default Predicate negate():返回一个逻辑的否定,对应逻辑非

4.default Predicate and(Predicate other):返回一个组合判断,对应短路与

5.default Predicate ot(Predicate other):返回一个组合判断,对应短路或

6.Predicate接口通常用于判断参数是否满足指定的条件

public static void main(String[] args) {
        boolean b = checkString("hll",s -> s.length() > 8);
        System.out.println(b);
        boolean b1 = checkString("HelloWorld",s -> s.length() > 8);
        System.out.println(b1);

        boolean b2 = checkString("hell",s -> s.length() > 8,s -> s.length() < 15);
        System.out.println(b2);
        boolean b3 = checkString("HelloWorld",s -> s.length() > 8,s -> s.length() < 15);
        System.out.println(b3);
    }
    private static boolean checkString(String s,Predicate pre,Predicate pre1){
        return pre.or(pre1).test(s);//相当于||
    }
    private static boolean checkString(String s,Predicate pre){
        return pre.negate().test(s);
    }

 十、Function接口:

1.Function:两个常用方法,T表示输入数据类型,R表示输出数据类型

2.R apply:将此函数应用与给定的参数

3.default Function andThen(Function after):返回一个组合函数,首先将该函数应用与输入,然后将after函数应用于结果

4.Function接口通常用于对参数进行处理,转换(处理逻辑由Lambda表达式实现),然后返回一个新的值

public static void main(String[] args) {
        convert("100",s -> Integer.parseInt(s));
        convert(100,i -> String.valueOf(i + 566));//键int类型转换为字符串
        convert("100",s -> Integer.parseInt(s),i -> String.valueOf(i + 566));
    }
    private static void convert(String s,Function fun){
        int i = fun.apply(s);
        System.out.println(i);
    }
    private static void convert(int i,Function fun){
        String s = fun.apply(i);
        System.out.println(s);
    }
    private static void convert(String s,Function fun,Function fun1){
        String ss = fun.andThen(fun1).apply(s);
        System.out.println(ss);
    }

 

你可能感兴趣的:(java,java,开发语言,数据结构,intellij-idea)