java学习(10) lambda表达式

来源:互联网 发布:服务器端 语言 python 编辑:程序博客网 时间:2024/05/22 08:10

参考连接:http://blog.csdn.net/renfufei/article/details/24600507/

Lambda表达式支持将代码块作为参数,可以使代码更加简洁。

Lmbda表达式语法: (parameters)->expression
下面是Java lambda表达式的简单例子:

// 1. 不需要参数,返回值为 5           () -> 5  // 2. 接收一个参数(数字类型),返回其2倍的值           x -> 2 * x  // 3. 接受2个参数(数字),并返回他们的差值          (x, y) -> x – y  // 4. 接收2个int型整数,返回他们的和          (int x, int y) -> x + y  // 5. 接受一个 string 对象,并在控制台打印,不返回任何值(看起来像是返回void)          (String s) -> System.out.print(s)  

接着看程序:

interface Eatable{    void taste();}interface Flyable{    void fly(String weather);}interface Addable{    int add(int a , int b);}public class LambdaQs{    // 调用该方法需要Eatable对象    public void eat(Eatable e)    {        System.out.println(e);        e.taste();    }    // 调用该方法需要Flyable对象    public void drive(Flyable f)    {        System.out.println("我正在驾驶:" + f);        f.fly("【碧空如洗的晴日】");    }    // 调用该方法需要Addable对象    public void test(Addable add)    {        System.out.println("5与3的和为:" + add.add(5, 3));    }    public static void main(String[] args)    {        LambdaQs lq = new LambdaQs();        // 第一个 Lambda表达式的代码块只有一条语句,可以省略花括号。        lq.eat(()-> System.out.println("苹果的味道不错!"));        // 第二个 Lambda表达式的形参列表只有一个形参,省略圆括号        lq.drive(weather ->        {            System.out.println("今天天气是:" + weather);            System.out.println("直升机飞行平稳");        });        // 第三个 Lambda表达式的代码块只有一条语句,省略花括号        // 代码块中只有一条语句,即使该表达式需要返回值,也可以省略return关键字。        lq.test((a , b)->a + b);    }}

上面程序展示了Lambda表达式的具体用法,上面第一个Lambda表达式相当于不带形参的匿名方法,由于该Lambda表达式的代码块只有一行代码,因此可以省略代码块的花括号; 第二个Lambda表达式相当于只带一个形参的匿名方法,由于它的形参列表只有一个形参,因此省略了圆括号;第三个Lambda表达式代码块中只有一行语句,这行语句返回值将作为该代码块的返回值。

上面程序种第一个Lambda处调用了eat()方法,他需要一个Eatable类型参数,但实际传入的是Lambda表达式;第二个Lambda处调用了drive()方法,其需要一个Flyable类型参数,但实际传入的是Lambda表达式;第三个Lambda表达式调用了test()方法,其需要一个Addable类型参数,但实际传入的也是一个Lambda表达式。 程序能正常运行说明 Lambda表达式实际上会被当成一个“任意类型”的对象,到底会被当成什么对象取决于运行环境的需要。

Lambda表达式与函数接口:
Lambda表达式的目标类型必须是“函数式接口”,函数式接口代表只包含一个抽象方法的接口,其它方法可以有多个。

注意:接口里的普通方法默认是抽象方法,所以可以不用在前面加上abstract修饰。

Runnable、ActionListener等接口都是函数式接口。

Lambda表达式有2个限制:

  1. Lambda表达式的类型必须是明确的函数式接口;
  2. Lambda表达式只能为函数式接口创建对象,Lambda表达式只能实现一个方法。

只是简单介绍了一下Lambda,更加深入的知识还需要继续学习,希望对大家有用,谢谢。

原创粉丝点击