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

常见函数式接口

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

Consumer接口

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

抽象方法:accept

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

代码:

复制代码
/*
Consumer接口是一个消费型接口 泛型执行什么类型 就可以使用accept方法消费什么类型的数据
至于具体怎么消费(使用) 需要自定义(输出,计算...)
 */
public class Demo01Consumer {
    /*
        定义一个方法
        方法的参数传递一个字符串的姓名
        方法的参数传递Consumer接口 泛型使用String
        可以使用Consumer接口消费字符串的姓名
     */
    public static void method(String name, Consumer<String> con){
        con.accept(name);
    }

    public static void main(String[] args) {
        //调用method方法 传递字符串姓名 方法的另一个参数consumer接口 是一个函数式接口 所以可以传递lambda表达式
        method("张三",(String name)->{
            //对传递的字符串进行消费
            //消费方式:直接输出字符串
            System.out.println(name);
            //消费方式:将字符串进行反转
            String reaname=new StringBuffer(name).reverse().toString();
            System.out.println(reaname);
        });
    }
}
复制代码

运行结果

 默认方法: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 Demo01AndThen {
    //定义一个方法 方法的参数传递一个字符串和两个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);
    }

    public static void main(String[] args) {
        //调用method方法 传递一个字符串 两个Lambda表达式
        method("Hello",
                (s)->{
                    //消费方式:把字符串转换为大写输出
                    System.out.println(s.toUpperCase());
                },
                (s)->{
                    //消费方式:把字符串转换为小写输出
                    System.out.println(s.toLowerCase());
                });
    }
}
复制代码

运行结果:

 练习:格式化打印信息

题目:

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

代码:

复制代码
public class Demo02Consumer {
    public static void method(String[] s, Consumer<String> con1, Consumer<String> con2) {
        for (String s1 : s) {
            con1.andThen(con2).accept(s1);
        }
    }


    public static void main(String[] args) {
        String[] str = {"张三,男", "李四,女", "王五,男"};

        method(str,
                s1 ->
                        System.out.println(s1.split(",")[0]),
                s1 ->
                        System.out.println(s1.split(",")[1]));
    }
}
复制代码

运行结果:

posted @ 2022-10-17 17:18  想见玺1面  阅读(69)  评论(0编辑  收藏  举报