基本概念
Lambda 表达式 Lambda 表达式”是一个匿名函数,可以包含表达式和语句,并且可用于创建委托或表达式目录树类型。所有 Lambda 表达式都使用 Lambda 运算符 =>;,该运算符读为“goes to”。该 Lambda 运算符的左边是输入参数(如果有),右边包含表达式或语句块。
Lambda 表达式 x => x * x 读作“x goes to x times x”。可以将此表达式分配给委托类型,如下所示:
delegate int del(int i);
del myDelegate = x => x * x;
int j = myDelegate⑸; //j = 25
基本环境
如果还没有安装Java8,那么你应该先安装才能使用lambda和stream。Lambda表达式是Java8中一个重要的新特性。
lambda表达式允许你通过表达式来代替功能接口。 lambda表达式就和方法一样,它提供了一个正常的参数列表和一个使用这些参数的主体(body,可以是一个表达式或一个代码块)。
基础语法
输入参数
在Lambda表达式中,输入参数是Lambda运算符的左边部分。它包含参数的数量可以为0、1或者多个。
1. 当输入参数数量为0时,Lambda表达式左边的一对小括号不能省略;
2. 当输入参数数量为1时,Lambda表达式左边的一对小括弧才可以省略;
3. 当输入参数的数量大于或者等于2时,Lambda表达式左边的一对小括弧中的多个参数质检使用逗号(,)分割。
// 1. 不需要参数,返回值为 10
() -> 10
// 2. 接收一个参数(数字类型),返回其平方值
x -> x * 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)
正如所见,lambda表达式可以将我们的代码缩减到一行。另一个例子是在**图形用户界面程序**中,**匿名类**可以使用lambda表达式来代替。 同样,在实现Runnable接口时也可以这样使用:
// 使用匿名内部类
btn.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
System.out.println("Hello World!");
}
});
// 或者使用 lambda expression
btn.setOnAction(event -> System.out.println("Hello World!"));
表达式或语句块
多个Lambda表达式可以构成Lambda语句块。语句块可以放到运算符的右边,作为Lambda的主体。
根据主题不同,Lambda表达式可以分为表达式Lambda和语句Lambda。语句块中可以包含多条语句,并且可以包含循环、方法调用和if语句等。
- lambda表达式:(parameters) -> expression
lambda语句块:(parameters) ->{statements; }
如果Lambda表达式的右边部分是一个语句块,那么该语句块必须被”{“和”}”包围。
(m,n)=>{int result=m+n; System.out.println(result);}
Lambdas在Streams中的使用
Stream是对集合的包装,通常和lambda一起使用。
使用lambdas可以支持许多操作,如 map, filter, limit, sorted, count, min, max, sum, collect 等等。
Stream使用**懒运算**,他们并不会真正地读取所有数据,遇到像getFirst() 这样的方法就会结束**链式语法**。