Java8-Lambda表达式

什么是Lambda表达式

Lambda可以理解为是一个匿名函数,Lambda表达式可以说是一段可以传递的代码。可以写出更简洁、更灵活的代码。作为一种更紧凑的代码风格,使Java的语言表达能力得到了提升。

在Java8以前,我们是通过接口来传递代码的(面向接口的编程)。
比如:

 Runnable runnable = new Runnable() {
            @Override
            public void run() {
                System.out.println("run----");
            }
        };

 Thread th = new Thread(runnable);

这里Thread类需要的其实并不是Runnable对象,而是它的方法

public abstract void run();

但是没有办法直接传递方法,只能通过接口来传递。

Java8提供了一种新的紧凑的传递代码的语法--就是Lambda表达式。比如刚才的Thread可以用lambda表达式修改为:

Runnable runnable = (() -> System.out.println("run----"));
Thread th = new Thread(runnable);
//还可以继续简化
Thread t = new Thread(() -> System.out.println("run----"));

是不是简洁多了?。

1.Lambda表达式语法

Lambda 表达式在Java 语言中引入了一个新的语法元素和操作符。这个操作符为 -> , 该操作符被称为 Lambda 操作符或剪头操作符。它将 Lambda 分为两个部分:

左侧: 指定了 Lambda 表达式所需要的所有参数
右侧:指定了 Lambda 体,即 Lambda 表达式要执行的功能即需传递的方法的实现。

语法格式:

1). 无参,无返回值,Lambda体只需一条语句

Runnable runnable = (() -> System.out.println("run----"));

2). Lambda需要一个参数

Consumer consumer = ((str) -> System.out.println(str));
//只有一个参数时,参数小括号可以省略,如下
Consumer consumer = (str -> System.out.println(str));

3). Lambda 需要两个参数,并且有返回值

Comparator comparator = ((num1, num2) -> {
   return num1 - num2;
});
//当表达式内只有一条语句时,return和大括号可以省略,如下
Comparator comparator = ((num1, num2) -> num1 - num2);

4). 数据类型可以省略,因为可由编译器推断得出,称为“类型推断”

BinaryOperator binaryOperator = ((Long num1, Long num2) -> num1 + num2);
//(Long l1, Long l2) 中参数类型可以省略,编译器可以自动推断,如下↓
BinaryOperator binaryOperator = ((num1, num2) -> num1 + num2);

可以看出,相比匿名内部类,传递代码变得更为直观,不再有实现接口的模板代码,不再声明方法,也名字也没有,而是直接给出了方法的实现代码

2.变量引用

​ 与匿名内部类类似,Lambda表达式也可以访问定义在主体代码外部的变量,但对于局部变量,它也只能访问final类型的变量,与匿名内部类的区别是,它不要求变量声明为final,但变量事实上不能被重新赋值。比如:

Integer num = 1;
Function function = (integer -> num);

可以访问局部变量num,但num不能被重新赋值,如果这样写:

Integer num = 1;
Function function = (integer -> num++);
//编译器报错
//Variable used in lambda expression should be final or effectively final

与匿名内部内比较

从以上内容可以看出,Lambda表达式与匿名内部类很像,主要就是简化了语法,使得编写更加简单,但Lambda与匿名内部类不同的是,java会为每个匿名内部类生成一个一个类,而Lambda表达式不会。

Lambda表达式不是匿名内部类,那它的类型到底是什么呢?是函数式接口

小结

​ 本章介绍了Lambda表达式,Lambda语法以及在Lambda表达式中的变量引用。

原文链接 : Java8 新特性 Lambda表达式 | 火尧

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