Lambda表达式

Lambda表达式支持将代码块作为方法参数,Lambda表达式允许使用更简洁的代码来创建只有一个抽象方法的接口(这种接口被称为函数值接口)的实例。

1.基本格式


() -> {}

形参列表。形参列表允许省略参数类型。如果形参列表只有一个参数,甚至连形参列表的圆括号也可以省略
箭头。必须通过英文中划线好和大于符号组成。
代码块。 如果代码块中包含一条语句。Lambda表达式允许省略代码块的花括号。Lambda代码块只有一条return语句,甚至可以省略return关键字。Lambda表达式需要返回值,而它的代码块中仅有一条省略了return的语句,Lambda表达式会自动返回这条语句的值
(Type1 param1, Type2 param2, ..., TypeN paramN) -> {
statment1;
statment2;
...
return resultStatement;}

2.简单示例


// 不需要参数,返回值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)

注意:Lambda表达式的目标类型必须是"函数式接口"。函数式接口代表只包含一个抽象方法的接口。函数式接口可以包含多个默认方法、类方法,但只能声明一个抽象方法。

3.应用


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); 
}

}

上例中Eatable、Flyable、Addable都是函数式接口。在以前可以采用上述方法调用接口。

Lambda表达式的调用:


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);

Java中的Lambda表达式与Swift闭包比较相似。下一篇介绍一下Swift中的闭包

你可能感兴趣的:(Lambda表达式)