lambda表达式
- 什么是lambda表达式
- lambda表达式的格式
- 使用场景
- 使用前提
- 省略规则
什么是lambda表达式
函数式编程思想(面向过程)
在数学中,函数就是有输入量和输出量的一套计算方法,就是拿“数据做操作”;
在面向对象的编程中,强调必须通过对象的形式来做事情,函数式编程思想则尽量的忽略对象的复杂语法,强调做什么,而不是以什么形式去做。lambda表达式就是函数式编程思想的具体体现。
lambda表达式的格式
(参数列表) -> {代码块}
如果有多个参数,参数之间用逗号隔开;如果只有一个参数,小括号可以省略;如果没有参数,小括号不能省略。
使用场景
- 简写匿名内部类
例如在创建线程时,我们使用匿名内部类的写法可以是这样的:
Thread t = new Thread(new Runnable() {@Overridepublic void run() {System.out.println("匿名内部类线程启动了");}
});
t.start();
如果我们使用lambda表达式的方式去写这个方法应该是这样的
Thread t = new Thread(() -> {System.out.println("匿名内部类线程启动了");
});
t.start();
由于Runnable接口的方法没有参数,所以这里lambda的参数列表中是空的(空的也要写括号!)。
是不是这种方式写起来要简单不少呢?这正符合函数式编程思想的理念,即尽量简化面向对象编程中一些复杂的关键字、方法名、返回类型。
通过这个例子相信大家都知道lambda表达式怎么写了,对于lambda表达式简单理解其实是拿()中的参数去 -> 做什么{代码块}
;这是类似数学中的函数一样,只有数值和操作符就可以计算出结果,所以称为函数式编程思想。
我们在多规则排序的时候也可以使用这种方式简化代码,如:
Integer[] numbers = {5, 2, 9, 1, 5, 6};// 使用匿名内部类方式进行升序排序
Arrays.sort(numbers, new Comparator<Integer>() {@Overridepublic int compare(Integer a, Integer b) {return a - b;}
});
对应的lambda写法
Integer[] numbers = {5, 2, 9, 1, 5, 6};// 使用Lambda表达式进行升序排序
Arrays.sort(numbers, (a, b) -> a - b);
是不是简单了很多,不需要记那些难记的方法名实在是太舒服了。
使用前提
那么既然lambda表达式这么简单,我们能不能使用lambda表达式代替所有的匿名内部类呢?答案是否定的,因为lambda表达式有它自己的使用条件,这个条件非常简单,如下:
- 要实现一个接口,且接口中有且仅有一个抽象方法。
省略规则
有的同学可能会问了,既然lambda表达式是简化代码的,那么它自己还能更简化吗(你是懂贪心的)。其实对于lambda表达式还有一些特定情况下的简化(狂喜~):
- 1、参数类型可以省略
- 2、方法体只有一句时大括号中的return和唯一一句的代码后的分号可以省略
- 3、只有一个参数时小括号可以省略