【Java学习】Supplier、Consumer接口

常用的函数式接口:
java.util.function.Supplier接口中仅包含一个无参的方法:T get()。用来获取一个泛型参数指定类型的对象数据
Supplier接口被称为生产型接口,指定接口的泛型是什么类型,那么接口中的get方法就会生产什么类型的数据

import java.util.function.Supplier;
public class Demo01Supplier {
    public static String getString(Supplier<String> supplier) {
        return supplier.get();
    }

    public static void main(String[] args) {
        String s = getString(()->{
            return "张三";
        });
        System.out.println(s);
    }
}

练习:求数组元素的最大值
使用Supplier接口作为方法参数类型,通过Lambda表达式求出int数组中的最大值
提示:接口的泛型请使用Java.lang.Integer类

import java.util.function.Supplier;
public class Demo02Test {
    public static int getMax(Supplier<Integer> sup){
        return sup.get();
    }

    public static void main(String[] args) {
        int[] arr = {12,41,42,64,673,632,55};
        int value = getMax(()->{
            int max = 0;
            for (int i : arr) {
                if (i > max) {
                    max = i;
                }
            }
            return max;
        });
        System.out.println("最大值为" + value);
    }
}

java. util. function. Consumer接口则正好与Suppl ier接口相反,
它是生产一个数据,而另一个消费一个数据,其数据类型由泛型决定。
Consumer接口中包含抽象方法void accept(T t), 意为消费- -个指定泛型的数据。
Consumer接口是一个消费型接口,泛型执行什么类型,就可以使用accept方法消费什么类型的数据
至于具体怎么消费(使用),需要自定义(输出,计算…)

import java.util.function.Consumer;
public class Demo03Consumer {
    public static void method(String  name, Consumer<String> con){
        con.accept(name);
    }

    public static void main(String[] args) {
        method("赵丽颖",(String name)->{
            System.out.println(name);

            //字符串反转输出
            String reName = new StringBuffer(name).reverse().toString();
            System.out.println(reName);
        });
    }
}

Consumer接口的默认方法andThen
作用:需要两个Consumer接口,可以把两个Consumer接口组合到- -起, 在对数据进行消费
例如:
Consumer con1
Consumer con2
String s = “hello”;
con1. accept(s); .
con2. accept(s);
连接两个Consumer接口再进行消费
con1. andThen(con2). accept(s);谁写前边谁先消费

public class Demo04AndThen {
    public static void method(String s, Consumer<String> con1,Consumer<String> con2){
        //con1.accept(s);
        //con2.accept(s);

        con1.andThen(con2).accept(s);
    }

    public static void main(String[] args) {
        method("Hello",(t)->{
            System.out.println(t.toUpperCase());
        },(t)->{
            System.out.println(t.toLowerCase());
        });
    }
}

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


import java.util.function.Consumer;
public class Demo05Test {
    public static void printInfo(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 = {"迪丽热巴,女", "古力娜扎,女"};
        printInfo(arr,(s)->{
            String name = s.split(",")[0];
            System.out.print("姓名" + name);
        },(s)->{
            String age = s.split(",")[1];
            System.out.println("性别"+ age);
        });
    }
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值