学习笔记-函数式接口

概念:函数式接口在Java中是指有且仅有一个抽象方法的接口(当然可以包含其他方法:静态、默认、私有方法)
Java中函数式接口的体现就是lamada表达式

@FunctionalInterface(注解)
作用:检测接口是否是函数式接口

函数式接口的使用:一般作为方法的参数和返回值使用
例:
作为参数:show(()->System.out.println("函数式接口的第一次使用"));
作为返回值:

public static Comparator<String> getComparable(){
    return (o1,o2)->o1.length()-o2.length();
}

lambda表达式编译后不会生成.class文件(效率高于匿名内部类)
而匿名内部类会生成.class文件(Demo$1.class)

lambda的特点:延迟加载

常用函数式接口:
1.Suppllier接口:生产型接口,指定接口泛型的类型,get()方法就会生产(返回)什么类型的数据,get方法具有返回值
例:

public class Demo {
    public static int getMax(Supplier<Integer> sup){
        return sup.get();
    }

    public static void main(String[] args) {
        int[] arr = {1,665,885,565,36,889,100};
        int result = getMax(() -> {
            int max = arr[0];
            for (int i : arr) {
                if (max < i){
                    max = i;
                }
            }
            return max;
        });
        System.out.println(result);
    }
}

2.Consumer接口:消费型接口,指定接口泛型的类型,accept(T t)方法就会消费(使用)什么类型的数据,至于怎么消费(使用)则需自定义,accep方法无返回值
例:

public class Demo {
    public static void print(String str,Consumer<String> consumer){
        consumer.accept(str);
    }

    public static void main(String[] args) {
        String name = "niefengqi";
        print(name,(str)->{
            //消费方式:直接输出
            System.out.println(str);
            //消费方式:反转输出
            StringBuilder builder = new StringBuilder(name);
            System.out.println(builder.reverse().toString());
        });
    }
}

Consumer接口的默认方法andThen()
作用:需要两个Consumer接口,可以把两个Consumer接口组合在一起,再对数据进行消费
例:

public class Demo {
    public static void method(String s, Consumer<String> con1,Consumer<String> con2){
//        con1.accept(s);
//        con2.accept(s);
        //上面两行代码相当于调用andThen方法
        con1.andThen(con2).accept(s);
    }

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

3.predicate接口:对某种数据类型进行判断(调用test(T t)抽象方法),结果返回一个boolean值
例:

public class Demo09 {
    public static boolean checkString(String s, Predicate<String> pre){
        return pre.test(s);
    }

    public static void main(String[] args){
//判断字符串是否以字母n开始
        boolean b = checkString("niefengqi", (s) ->s.charAt(0) == 'n' || s.charAt(0) == 'N');
        System.out.println(b);
    }
}

predicate接口的默认方法and(),表示并且关系,也可以用于连接两个判断条件
相当于逻辑与&&

pre1.and(pre2).test(t);

predicate接口的默认方法or(),表示并且关系,也可以用于连接两个判断条件
相当于逻辑或||

pre1.or(pre2).test(t);

4.Function<T,R>接口:用于根据一个类型的数据得到另一个类型的数据
抽象方法: R apply(T t) 根据参数t的类型得到类型R的返回值
默认方法: andThen() 用于进行组合操作,该方法同样用于先做什么再做什么的场景,和Consum中地andThen差不多。
格式: fun1.andThen(fun2).apply(t);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值