参考①:JDK已有函数函数式接口介绍
Java 8 函数式接口 | 菜鸟教程 (runoob.com)
参考②:Java之线程池和Lambda表达式 - 我想回家 - 博客园 (cnblogs.com)
lambda体现的是一种函数式编程的思想, 它强调的是做什么,而不是以什么形式做。
使用前提
-
使用Lambda必须具有接口,且要求接口中有且仅有一个抽象方法。无论是JDK内置的Runnable 、Comparator 接口还是自定义的接口,只有当接口中的抽象方法存在且唯一时,才可以使用Lambda。
-
使用Lambda必须具有上下文推断。也就是方法的参数或局部变量类型必须为Lambda对应的接口类型,才能使用Lambda作为该接口的实例。
线程创建
使用Lambda简化前
实现Runnable接口的匿名内部类的实现:
public class Demo01Runnable { public static void main(String[] args) { // 匿名内部类 Runnable task = new Runnable() { @Override public void run() { // 覆盖重写抽象方法 System.out.println("多线程任务执行!"); } }; new Thread(task).start(); // 启动线程 } }
代码分析
Thread 类需要Runnable 接口作为参数,其中的抽象run 方法是用来指定线程任务内容的核心;
为了指定run 的方法体,不得不需要Runnable 接口的实现类;
为了省去定义一个RunnableImpl 实现类的麻烦,不得不使用匿名内部类;
必须覆盖重写抽象run 方法,所以方法名称、方法参数、方法返回值不得不再写一遍,且不能写错;
而实际上,似乎只有方法体才是关键所在。
使用Lambda简化后
public class Demo01Runnable { public static void main(String[] args) { new Thread(()->System.out.println("多线程任务执行!")).start(); // 启动线程 } }
集合排序比较器
// 创建数组 Integer[] arr = {1,8,3,4,9,2,5}; // 匿名内部类实现数组升序排序 Arrays.sort(arr,new Comparator<Integer>(){ //使用Lambda简化前 @Override public int compare(Integer o1, Integer o2) { return 0; } }); //使用Lambda简化数组的升序排序 Arrays.sort(arr,( a, b)->{ return a - b ;});
Lambda表达式的省略规则
在Lambda标准格式的基础上,使用省略写法的规则为:
-
小括号内参数的类型可以省略;
-
如果小括号内有且仅有一个参,则小括号可以省略;
-
如果大括号内有且仅有一个语句,则无论是否有返回值,都可以省略大括号、return关键字及语句分号。
虽然有省略写法,但是我感觉这个有点灵活,所以不建议省略,因为代码是给别人看的,省略的话感觉别人看起来会有点费劲.