为什么要使用lamda表达式
1、避免匿名内部类定义过多
2、使代码看起来更简洁
3、去掉一堆无意义的代码,只留下核心的逻辑代码
资料补充: 匿名内部类
没有类的名称,必须借助接口或者父类
public class HelloWorldAnonymousClasses {
2
3 /**
4 * 包含两个方法的HelloWorld接口
5 */
6 interface HelloWorld {
7 public void greet();
8 public void greetSomeone(String someone);
9 }
10
11 public void sayHello() {
12
13 // 1、局部类EnglishGreeting实现了HelloWorld接口
14 class EnglishGreeting implements HelloWorld {
15 String name = "world";
16 public void greet() {
17 greetSomeone("world");
18 }
19 public void greetSomeone(String someone) {
20 name = someone;
21 System.out.println("Hello " + name);
22 }
23 }
24
25 HelloWorld englishGreeting = new EnglishGreeting();
26
27 // 2、匿名类实现HelloWorld接口
28 HelloWorld frenchGreeting = new HelloWorld() {
29 String name = "tout le monde";
30 public void greet() {
31 greetSomeone("tout le monde");
32 }
33 public void greetSomeone(String someone) {
34 name = someone;
35 System.out.println("Salut " + name);
36 }
37 };
38
39 // 3、匿名类实现HelloWorld接口
40 HelloWorld spanishGreeting = new HelloWorld() {
41 String name = "mundo";
42 public void greet() {
43 greetSomeone("mundo");
44 }
45 public void greetSomeone(String someone) {
46 name = someone;
47 System.out.println("Hola, " + name);
48 }
49 };
50
51 englishGreeting.greet();
52 frenchGreeting.greetSomeone("Fred");
53 spanishGreeting.greet();
54 }
55
56 public static void main(String... args) {
57 HelloWorldAnonymousClasses myApp = new HelloWorldAnonymousClasses();
58 myApp.sayHello();
59 }
60 }
运行结果
1 Hello world
2 Salut Fred
3 Hola, mundo
该例中用局部类来初始化变量englishGreeting,用匿类来初始化变量frenchGreeting和spanishGreeting,两种实现之间有明显的区别:
1)局部类EnglishGreetin继承HelloWorld接口,有自己的类名,定义完成之后需要再用new关键字实例化才可以使用;
2)frenchGreeting、spanishGreeting在定义的时候就实例化了,定义完了就可以直接使用;
3)匿名类是一个表达式,因此在定义的最后用分号";"结束。
函数式接口
1、任何接口,如果只包含唯一一个抽象方法,那么他就是函数式接口
2、对于函数式接口,可以使用Lamda表达式来创建该接口的API
Lamda表达式:
1、只有一行代码的时候才能简化为一行class = a -> System.out.println(a)
2、前提条件必须是函数式接口
3、多个参数时,也可以去掉类型,必须加上括号
网友评论