函数式接口-常见函数式接口-Consumer接口

常见函数式接口

JDK提供了大量常用的函数式接口以丰富Lambda的经典使用常见 它们注意在java.util.function包中被提供

Consumer接口

Consumer<T>接口则正好与Supplier接口相反 它不是生成一个数据 而是消费一个数据 其数据类型由泛型决定

抽象方法:accept

Consumer接口中包含抽象方法void accept(T t),意为消费一个指定泛型的数据

代码:

public class BConsumer {
    public static void consumeString(String name,Consumer<String> con){
        con.accept(name);
    }
    public static void main(String[] args) {
        //调用consumeString方法,传递字符串姓名,方法的另一个参数是Consumer接口,是一个函数式接口,所以可以传递Lambda表达式
        consumeString("赵丽颖", (String name)->{
            /*
                对传递的字符串进行消费
                消费方式:直接输出字符串
             */
//            System.out.println(name);
            //消费方式:把字符串进行反转输出
            String s = new StringBuffer(name).reverse().toString();
            System.out.println(s);
        });
    }
}

 

默认方法:andThen

如果一个方法的参数和返回值全都是Consumer类型 那么可以实现效果 消费数据的时候 首先做一个操作 然后再做一个操作 实现组合 而这个方法就是Consumer接口中的default方法andThem

作用:需要两个Consumer接口 可以把两个ConSumer接口组合到一起 在对数据进行消费

例如:

consumer<String> con1

consumer<String> con2

String s="hello"

con1.accept(s);

con2.accept(s);

连接两个Consumer接口 再进行消费

con1.andThen(con2).accept(s);谁写前边谁先消费

代码:

public class BAndThen {
    //定义一个方法,方法的参数传递一个字符串和两个Consumer接口,Consumer接口的泛型使用字符串
    public static void method(String s, Consumer<String> con1,Consumer<String> con2){
        con1.accept(s);
        con2.accept(s);
        System.out.println("---------------");
        //使用andThen方法,把两个Consumer接口连接到一起,在消费数据
        con1.andThen(con2).accept(s);//con1连接con2,先执行con1消费数据,在执行con2消费数据
    }
    public static void main(String[] args) {
        //调用method方法,传递一个字符串,两个Lamdba表达式
        method("Hello",
                (t)->{
                    //消费方式:把字符串转换为大写输出
                    System.out.println(t.toUpperCase());
                },
                (t)->{
                    //消费方式:把字符串转换为小写输出
                    System.out.println(t.toLowerCase());
        });
    }
}

运行结果:

 

 

 

练习:格式打印信息

题目:

下面的字符串数组当中存有多条信息 请按照格式“姓名:xx。性别:xx”的格式将信息打印出来 要求将打印姓名的动作作为第一个Consumer接口的Lambda实例 将打印性别的动作作为第二个Consumer接口的Lambda实例 将两个Consumer接口拼接到一起

代码:

public class BConsumer2 {
    //定义一个方法,参数传递String类型的数组和两个Consumer接口,泛型使用String
    public static void pringInfo(String[] arr, Consumer<String> con1,Consumer<String> con2){
        //遍历字符串数组
        for (String s : arr) {
            con1.andThen(con2).accept(s);
        }
    }

    public static void main(String[] args) {
        //定义一个字符串类型的数组
        String[] arr = {"迪丽热巴,女","古力娜扎,女","马尔扎哈,男"};
        //调用pringInfo方法,传递一个字符串数组,和两个Lambda表达式
        pringInfo(arr,s -> {
            //消费方式:对s进行切割,获取姓名,按照指定的格式输出
            String name = s.split(",")[0];
            System.out.print("姓名:"+name);
        }, s -> {
            //消费方式:对s进行切割,获取年龄,按照指定的格式输出
            String age = s.split(",")[1];
            System.out.print(",年龄:"+age+",");
        });
    }
}

运行结果:

 

posted @ 2022-08-21 17:18  monkey大佬  阅读(145)  评论(0)    收藏  举报