Lambda
表达式—是一种表示匿名函数,闭包的运算符
1. 需要Lambda表达式的原因
- 在Java中,我们无法将函数最为参数传递给一个方法,也无法声明返回一个函数的方法
- 在
JavaScript
中,函数参数是一个函数,返回值是另一个函数的情况是非常常见的—JavaScript
是一门非常典型的函数式语言
其作用是
- 传递行为,而不仅仅是值
- 提升抽象层次
- API重用性更好
- 更加灵活
1.1 Lambda表达式的基本结构
(param1, param2, param3,...)->{
//code
}
1.2 函数式接口
关于函数式接口
- 如果一个接口只有一个抽象方法,那么该接口就是一个函数式接口
- 如果我们在某个接口上声明了
@FunctionalInterface
注解,那么编译器就是按照函数式接口的定义来要求该接口 - 如果某个接口只有一个抽象方法,但我们并没有给该接口声明
@FunctionalInterface
注解,那么编译器依旧会将该接口看作是函数式接口 - 如果一个函数式接口声明的抽象方法重写了
java.lang.Object
中的方法,那么其抽象方法个数不会因此而增加
函数式接口需满足两个条件
- 使用
FunctionalInterface
注解的类型是接口类型而不是注解,枚举或类 - 注解类型满足函数式接口的要求
1.3 Lambda表达式的作用
- Lambda表达式为Java添加了缺失的函数式编程特性,使我们能将函数当做一等公民看待
- 在将函数左右一等公民的语言中,Lambda表达式的类型是函数,但
在Java语言中,Lambda表达式是对象
,他们必须依附于一类特别的对象类型—函数式接口functional interface
1.3 函数式接口的实现方式
- Lambda表达式
- 方法引用
- 构造方法引用
2. Java中Lambda表达式
1 在Java中的特点Lambda表达式的特点
- 是一种匿名函数
- 没有声明的方法—没有访问修饰符,返回值声明和方法
2 Java Lambda基本语法
//Java中的Lambda表达式基本语法
(argument) -> (body)
//比如说
(arg1, arg2) -> {body}
(type1 arg1, type2 arg1...)->{body}
3.Lambda实例说明
(int a, int b)->{return a+b;}
()->{System.out.println("Hello World");}
(String s)->{System.out.println(s);}
()->42
()->{return 3.1415}
4.Lambda表达式结构
- 一个Lambda表达式时可以有零个或多个参数
- 参数的类型既可以明确声明,也可以根据上下文来推断—
(int a)
与(a)
效果相同 - 所有参数需要包含在
()
圆括号内,参数之间用逗号相隔—(a, b)
或者(int a, int b)
或(String a, int b, float c)
- 空
()
圆括号代表参数集为空—()->42
- 当只要一个参数时,且其类型可推导时,圆括号
()
可省略—a->return a*a
- 表达式的主体可包含零条或多条语句
- 如果表达式的主体只有一条语句时,花括号
{}
可省略(匿名函数的返回类型与该主体表达式一致) - 如果表达式的主体包含一条以上语句时,咋表达式必须包含在花括号
{}
内(行程代码块). 匿名函数的返回类型与代码块的返回类型一致,若没有则返回空
5.Lambda表达式类型
Statement Lambda
—语句Lambda
如
Supplier<String> supplier = () -> {return "hello world";};
expression Lambda
—表达式Lambda
如
Supplier<String> supplier = () -> "hello world";
两者实现的效果是一致的,只是语法上存在差异
当 Statement Lambda
中的代码有且只有一行时,去掉{}
,return
,;
后可以转为expression Lambda
,即后者是前者的简化版本.