函数式接口 函数式接口概念, 自定义函数式接口
函数式接口: 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] } }
|