java学习(10) lambda表达式

参考连接: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,更加深入的知识还需要继续学习,希望对大家有用,谢谢。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值