Java 8引入了一种新的编程结构——Lambda表达式。
Lambda表达式使您可以在不创建完整类的情况下编写函数,这在很多情况下能让代码变得更加清晰、简洁。
以下我们将进行详细介绍。
1. 什么是Lambda表达式?
Lambda表达式,也被称为闭包,是Java 8的一大亮点。
它允许将函数作为一个方法的参数(函数作为参数传递到方法中),或者把代码看作数据:函数名可以用来引用一个函数;函数可以作为任何对象的属性;可以存储在数据结构中等等。
2. Lambda表达式的语法
Lambda表达式的语法格式如下:
(parameters) -> expression
或
(parameters) ->{ statements; }
这里主要有三部分:
- parameters:Lambda表达式的输入参数,可以省略参数类型。
->
:Lambda操作符。- expression或statements:Lambda体。
示例:
// 无参数,返回值为5
() -> 5
// 接收一个参数(数字类型),返回其2倍的值
x -> 2 * x
// 接受2个参数(数字),并返回他们的差值
(x, y) -> x – y
// 接收2个int型整数,返回他们的和
(int x, int y) -> x + y
// 接受一个 string对象,并在控制台打印,不返回任何值(看起来像是无返回值方法)
(String s) -> System.out.print(s)
3. 函数式接口
Lambda表达式如何定义呢?其实,我们通过函数式接口来定义。
函数式接口是只包含一个抽象方法的接口,用于定义Lambda表达式的类型。
Java 8中引入了一个新的注解@FunctionalInterface
,用来标记函数式接口,这个注解是非必须的,只要接口满足函数式接口的标准(即只包含一个抽象方法),虚拟机会自动判断,但最好在接口上使用@FunctionalInterface
进行声明。
@FunctionalInterface
public interface GreetingService
{
void sayMessage(String message);
}
4. 使用Lambda表达式
Lambda表达式主要用来定义行内执行的方法类型接口,例如,一个简单方法接口。
在下面的例子中,我们用各种类型的Lambda表达式来定义GreetingService
接口的greet
方法。
public class Test {
GreetingService greetService1 = message -> System.out.println("Hello " + message);
GreetingService greetService2 = (message) -> System.out.println("Hello " + message);
greetService1.sayMessage("World");
greetService2.sayMessage("Java");
}
Lambda表达式为Java添加了缺失的函数式编程特性,使我们能将函数当作一等公民看待。
在大型项目开发中,Lambda表达式能帮助我们写出更优雅、简洁的代码,从而提高工作效率。