Lambda表达式
Lambda表达式支持将代码块作为方法参数,Lambda表达式允许使用更简洁的代码来创建只有一个抽象方法的接口(这种接口被称为函数值接口)的实例。
1.基本格式
<pre>
() -> {}
形参列表。形参列表允许省略参数类型。如果形参列表只有一个参数,甚至连形参列表的圆括号也可以省略
箭头。必须通过英文中划线好和大于符号组成。
代码块。 如果代码块中包含一条语句。Lambda表达式允许省略代码块的花括号。Lambda代码块只有一条return语句,甚至可以省略return关键字。Lambda表达式需要返回值,而它的代码块中仅有一条省略了return的语句,Lambda表达式会自动返回这条语句的值
(Type1 param1, Type2 param2, ..., TypeN paramN) -> {
statment1;
statment2;
...
return resultStatement;}
</pre>
2.简单示例
<pre>
// 不需要参数,返回值1
() -> 1
// 一个参数(数字类型),返回其2倍的值(当参数个数只有一个时,可以省略小括号)
x -> 2 * x
// 2个参数(数字),返回差值(参数类型省略,一般情况下,编译器会从上下文环境中推断出参数类型)
(x, y) -> x – y
// 2个int型整数,返回和值(当lambda表达式只包含一条语句时,可以省略大括号、return和语句结尾的分号)
(int x, int y) -> x + y
// 一个 string类型的参数,在控制台打印,无返回值(返回void)
(String s) -> System.out.print(s)
</pre>
注意:Lambda表达式的目标类型必须是"函数式接口"。函数式接口代表只包含一个抽象方法的接口。函数式接口可以包含多个默认方法、类方法,但只能声明一个抽象方法。
3.应用
<pre>
package lambdaTest;
interface Eatble{
void taste();
}
interface Flyable{
void fly(String weather);
}
interface Addable{
int add(int a, int b);
}
public class LambdaTest {
public void eat(Eatble e){
System.out.println(e);
e.taste();
}
public void drive(Flyable f,String weather){
System.out.println(f);
f.fly(weather);
}
public void test(Addable add,int a,int b) {
System.out.println(a+"和"+b+"的和为:"+add.add(a, b));
}
public static void main(String[] args) {
LambdaTest lambdaTest = new LambdaTest();
lambdaTest.eat(new Eatble() {
@Override
public void taste() {
System.out.println("味道不错");
}
});
lambdaTest.drive(new Flyable() {
@Override
public void fly(String weather) {
// TODO Auto-generated method stub
System.out.println("今日天气:"+weather);
}
},"碧空如洗的晴日");
lambdaTest.test(new Addable() {
@Override
public int add(int a, int b) {
// TODO Auto-generated method stub
return a+b;
}
},5,6);
}
}
</pre>
上例中Eatable、Flyable、Addable都是函数式接口。在以前可以采用上述方法调用接口。
Lambda表达式的调用:
<pre>
1、无参数形式,无返回值:
Eatble eatble = ()->System.out.println("味道不错");
lambdaTest.eat(eatble);
lambdaTest.eat(()->System.out.println("真难吃"));
2、有参数无返回值:
Flyable flyable = weather->System.out.println("今日天气:"+weather);
lambdaTest.drive(flyable, "碧空如洗的晴日");
lambdaTest.drive((weather)->System.out.println("今日天气:"+weather), "大暴雨");
3、有参数有返回值:
Addable addable = (a,b)->{return a+b;};
lambdaTest.test(addable, 12, 6);
lambdaTest.test((a,b)->{return a+b;}, 15, 6);
</pre>
Java中的Lambda表达式与Swift闭包比较相似。下一篇介绍一下Swift中的闭包