A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© dyynrahbsqt 中级黑马   /  2018-12-2 16:55  /  444 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

函数式接口
函数式接口概念, 自定义函数式接口
函数式接口: JDK 8 新特性
    有且仅有一个抽象方法的接口, 适用于函数式编程场景的接口
    (默认方法, 静态方法, 私有方法, 与java.lang.Object类中定义相同的抽象方法, 都不算作抽象方法)
自定义函数式接口:
        接口中有且只有一个抽象方法
@FunctionalInterface的作用:
        在接口上使用, 检测当前的接口是否为函数式接口
Lambda具有延迟执行的特点:
        传递Lambda对象, 只有当符合执行条件时, 才会执行代码
使用Lambda表达式作为方法参数
当一个方法的参数是一个函数式接口时, 可以使用Lambda表达式传递该参数, 简化匿名内部类的代码:
public class Test {
    public static void main(String[] args) {
        // 匿名内部类方式
        startThread(new Runnable() {
            @Override
            public void run() {
                System.out.println(Thread.currentThread().getName() + "-->线程启动了");
            }
        });
        // Lambda表达式方式: 标准格式
        startThread(()->{
            System.out.println(Thread.currentThread().getName() + "-->线程启动了");
        });
        // Lambda表达式方式: 省略格式
        startThread(()->System.out.println(Thread.currentThread().getName() + "-->线程启动了"));
    }
    public static void startThread(Runnable r) {
        new Thread(r).start();
    }
}
使用Lambda表达式作为方法返回值
当一个方法的返回值是一个函数式接口时, 可以返回Lambda表达式, 简化匿名内部类的代码:public class Test {
    // 返回一个按照字符串长度降序的比较器对象
    private 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();
    }
    public static void main(String[] args) {
        String[] arr = {"aaa", "b", "cccccc", "ddddddddddd"};
        System.out.println("排序前:" + Arrays.toString(arr));  // 排序前:[aaa, b, cccccc, ddddddddddd]
        Arrays.sort(arr, getComparator());
        System.out.println("排序后:" + Arrays.toString(arr));  // 排序后:[ddddddddddd, cccccc, aaa, b]
    }
}

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马