Lambda 表达式
Lambda表达式可以看做是一个匿名类。将一个Lambda表达式做为参数传递给方法,行为参数化,就实现了函数式编程。
在没有Lambda之前,要实现函数式编程就需要使用匿名类,如果用Lambda会使得代码更加简洁、清晰。
lambda表达式
- Lambda(其实就是希腊字母λ大写字符为Λ)就是没有名称的代码块,有形式参数列表和实现体
- 可以作为方法的参数或者赋值给变量
- 自身没有类型, 编译器会根据环境推断出其类型
例如
(int x,int y)-> {
return x+y;};
(int x,int y)->{
int max= x>y ? x: y; return max;};
lambda表达式的语法
(<参数列表>)->(<实现体>)
- 与方法有所不同:
- 不能有名称;
- 不能有返回值类型,其类型由编译器根据环境推断出其类型;
- 没有throws,由编译器根据环境推断
- 不能声明参数类型,即参数不能为泛型
- 可以将其赋值给一个合适的函数式接口变量.
- 省略参数类型:编译器会根据使用的环境推断出其参数类型.
如 (int x,int y)-> x+y;
可以省略为(x,y)->x+y;
但是不能写成(int x,y)-> x+y;
- 当只有一个参数时,不仅能省略参数类型,连小括号也能省略
如 (int x)-> x;
可以省略为x->x
但是不允许写为 int x-> x;
- 没有参数时,小括号不能省略
如 ()->System.out.println("hello");
- 带修饰符的参数类型不能省略
如( final int x,int y)-> x+y;
不能写 (x,y)->x+y;
或者(final x,y)-> x+y;
- lamda表达式的实现体:
- 可以是代码块或者表达式
public class Lambda2 {
public static void main(String[] args) {
// lambda表达式可以复制给一个函数式接口
Addable sum = (int a, int b) -> {
return a + b;
};
Addable q = (a, b) -> a + b;
Outputable out = () -> {
System.out.println();
};
Outputable out3 = () ->
System.out.println();
;
//方法引用
Outputable out2 = System.out::println;
//有修饰符修饰时,参数类型不能省略
Finable fin = (final int x, int y) -> x / y;
}
private static interface Addable {
int add(int a, int b);
}
private static interface Outputable {
void output();
}
private static interface Finable {
int divide(final int x, int y);
}
}
Lambda 表达式的结构
- 一个 Lambda 表达式可以有零个或多个参数
- 参数的类型既可以明确声明,也可以根据上下文来推断。例如:(int a)与(a)效果相同
- 所有参数需包含在圆括号内,参数之间用逗号相隔。例如:(a, b) 或 (int a, int b) 或 (String a, int b, float c)
- 空圆括号代表参数集为空。例如:() -> 42
- 当只有一个参数,且其类型可推导时,圆括号()可省略。例如:a -> return a*a
- Lambda 表达式的主体可包含零条或多条语句
- 如果 Lambda 表达式的主体只有一条语句,花括号{}可省略。匿名函数的返回类型与该主体表达式一致
- 如果 Lambda 表达式的主体包含一条以上语句,则表达式必须包含在花括号{}中(形成代码块)。匿名函数的返回类型与代码块的返回类型一致,若没有返回则为空