函数式接口1

1、 函数式接口
函数式接口概念:有且仅有一个抽象方法的接口。接口中可以包含其他方法(默认,静态,私有 )
1.1 @FunctionalInterface注解
作用:可以检测接口是否是一个函数式接口(只有一个抽象方法)
是:编译成功
否:编译失败(接口中没有抽象方法或者有多个抽象方法)
函数式接口定义代码示例:

@FunctionalInterface
public interface FunctionInterface {
    // 定义抽象方法
    public abstract void method ();
    // 私有 (从Java 9开始,接口当中允许定义私有方法。)解决多个默认/静态方法代码重复的问题
    private void method1() {
        System.out.println("我是私有方法");
    }
    // 静态 (从Java 8开始,接口当中允许定义静态方法)
    public static void method2() {
        System.out.println("我是静态方法");
    }
    /*
        默认 (jdk1.8开始,接口里允许定义默认方法) 解决接口升级的问题,当有一个接口,
        并且n多个类实现了这个接口;而当接口再次添加抽象方法的时候,n多个实现类就会报错。而出现了默认方法就解决了这个问题
    */
    public default void method3() {
        System.out.println("我是默认方法");
    }
}

1.2 函数式接口的使用场景:
一般可以作为方法的参数和返回值类型
代码示例:

    public static void main(String[] args) {
        // 方法的参数式一个接口,所以可以传递接口的实现类对象
        show(new FunctionInterfaceImpl());

        // 方法的参数式一个接口,可以传递接口的匿名内部类
        show(new FunctionInterface() {
            @Override
            public void method() {
                System.out.println("使用匿名内部类重写接口的抽象方法");
            }
        });

        // 方法的参数是一个函数式接口,可以传递Lambda表达式
        show(() -> {
            System.out.println("使用Lambda表达式重写接口的抽象方法");
        });

        // 简化版Lambda表达式
        show(() -> System.out.println("简化版Lambda表达式重写接口的抽象方法"));

    }
    // 定义方法,参数使用函数式接口
    public static void show (FunctionInterface fun) {
        fun.method();
    }

1.3 参数使用Lambda表达式
作用:可以避免性能浪费
Lambda特点:延迟加载
Lambda使用前提:必须存在函数式接口
举例:

    public static void main(String[] args) {
        String msg1 = "Hello";
        String msg2 = "World";
        String msg3 = "Java";
        // 条件不满足,传递message拼接字符串造成了性能浪费
        show(2, msg1 + msg2 + msg3);
    }

    public static void show(int level, String message) {
        if (level == 1) {
            System.out.println(message);
        }
    }

/*
	解决方法,可以定义一个函数式接口并定义字符串拼接的抽象方法,方法的形参传递此接口;
	调用方法时实参传递此接口的Lambda表达式,如果条件成立则拼接字符串返回,条件不成立不执行Lambda表达式
*/
// 定义函数式接口
@FunctionalInterface
public interface FunctionInterface {

    // 定义拼接字符串的抽象方法
    public abstract String builderMessage();
}

    public static void main(String[] args) {
        String msg1 = "Hello";
        String msg2 = "World";
        String msg3 = "Java";

        show(2, () -> {
            System.out.println("Lambda有延迟执行的特性,不满足条件不执行");
            return msg1 + msg2 + msg3;
        });
    }

    public static void show(int level, FunctionInterface myInterface) {
        if (level == 1) {
            System.out.println(myInterface.builderMessage());
        }
    }

1.4 函数式接口作为方法返回值按理

// 按照字符串的长度排序
    public static void main(String[] args) {
        String[] arr = {"aaaaa", "eeeeee", "wwwwwwwww"};
        System.out.println(Arrays.toString(arr));
        Arrays.sort(arr, getComparator());
        System.out.println(Arrays.toString(arr));
    }

    public static Comparator<String> getComparator() {
        /*
        // 匿名内部类实现
        return new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                return o2.length() - o1.length();
            }
        };
         */
        /*
        // Lambda表达式
        return ((String o1, String o2) -> {
            return o2.length() -o1.length();
        });
         */
        // 简化Lambda
        return ((o1, o2) -> o2.length() -o1.length());
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值