Lambda表达式(JAVA)

注:如果没有学过匿名内部类接口不推荐往下看。

Lambda表达式的语法:

(parameters) -> expression 或 (parameters) ->{ statements; }

  • parameters:表示参数列表;
  • ->:可理解为“被用于”的意思;
  • expression:表示一条语句;
  • statements:表示多条语句。

Lambda可以理解为:Lambda就是匿名内部类的简化。

lambda表达式可以通过表达式来代替功能接口,而这个接口必须是函数式接口

lambda的本质就是函数式接口。
此时你可能根本没明白我在说啥,你可以先忘掉,因为这些只是让你有一个简单的印象。


函数式接口

函数式接口其实就是一个只定义了一个抽象方法的接口,可以使用 @FunctionalInterface 注解。

例如这就是一个函数式接口。

@FunctionalInterface
interface A{
    void print();
}

:是只定义一个抽象方法的接口

例如它也是函数式接口。

@FunctionalInterface
interface A{
    void print();//只定义了这一个抽象方法
    static void bb(){}
    default void cc(){}
}

此时函数式接口已经了解完了这时再看这句话:

  • Lambda可以理解为:Lambda就是匿名内部类的简化。
  • lambda表达式可以通过表达式来代替功能接口,而这个接口必须是函数式接口

Lambda表达式的使用

要想使用Lambda表达式就必须要有一个函数式接口。

@FunctionalInterface
interface A{
    void print();//无参无返回值的打印方法
}

因为Lambda表达式是匿名内部类的简化版所以我们可以先使用匿名内部类来调用一下这个方法

    public static void main(String[] args) {
        A a = new A(){
            @Override
            public void print(){
                System.out.println("hello");
            }
        };
        a.print();
    }

此时编译器其实已经提示此处可以使用 Lambda 表达式了。

按照提示按下快捷键后就变成了这样:

对应关系是这样的(此时如果不理解可以跳转到文章开头):

//接收一个参数(数字类型),返回其2倍的值
(int x) -> {return x * 2;};
//或者简写
x -> x * 2;
//接受2个参数(数字),并返回他们的和
(int x, int y) -> {return x * 2;};
//或者简写
(x, y) -> x + y;

注:当有多个参数时就算每个参数类型不相同也能省略参数

Lambda的变量捕获

所谓的变量捕获其实就是把当前作用域中的变量在Lambda表达式内部复制了一份,此时外面的变量是否销毁就无所谓了。

Lambda表达式里面的代码是可以自动捕获到上层区域中涉及到的局部变量

只能捕获常量或者是没有改变过值的变量。

此时的 f 必须没有改变过值,就算在表达式内部或下面都不行。

如果将变量写到方法的往外面变成成员变量就可以不受上述限制,但此时就不是变量捕获的语法了,而是变成了内部类访问外部类的语法了。

此处变量用 static 修饰完全是因为 main 方法是用 static 修饰的。

评论 27
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值