UM2L16——lambda表达式

Java中lambda表达式语法

Java中的lambda表达式和C#中区别很大,Java中没有委托和事件
只有通过函数式接口来存储lambda表达式来进行使用,Java的函数式接口可以充当C#中委托的角色

基本结构:(参数) -> {代码块}

基于基本结构的写法:

  1. () -> {代码块};
  2. () -> 结果表达式;​(相当于返回值)
  3. (参数) -> {代码块};
  4. 参数 -> {代码块};​ (当参数只有一个时)
  5. 参数 -> 结果表达式;​(相当于返回值)
  6. (参数1,参数2,参数3...) -> {代码块};
  7. (参数1,参数2,参数3...) -> 结果表达式;​(相当于返回值)

用于装载lambda表达式的函数式接口

Java没有如C#那样的委托与事件,如果想要实现类似于委托那样的实现,我们可以通过函数式接口存储lambda表达式方法来实现

函数式接口指仅仅包含一个抽象方法的接口,声明函数式接口后,我们可以用以下语法来使用lambda表达式
接口名 变量名 = lambda表达式​,可以将Java的函数式接口看作Java中扮演的委托的角色

注意:lambda表达式的结构必须和函数式接口中声明的方法一致(返回值,参数数量)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
interface ITest {
int Test();
}

interface ITest2 {
void Test(int a, String str);
}

public class Lesson21 {
public static void main(String[] args) {
ITest t = () -> {
int i = 1;
int i2 = 2;
return i + i2;
};

System.out.println(t.Test());

ITest2 t2 = (a, b) -> {
System.out.println(a);
System.out.println(b);
};

t2.Test(10, "123");
}
}

输出:

1
2
3
3
10
123

lambda表达式调用外部变量

  1. 无法更改局部变量的值
  2. 可以更改外部类的成员变量的值
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
interface ITest {
int Test();
}

public class Lesson21 {
public static int value2 = 99;

public static void main(String[] args) {
ITest t = () -> {
//value1 = 100; 不能修改局部变量
value2 = 100; //可以修改外部类的成员变量
return value2;
};
System.out.println(t.Test());
}
}

输出:

1
100