-> 是Lambda表达式,也叫Lambda函数,是Java 8 的新特性。
Lambda可以读作 “浪马达”。
Lambda 允许把函数作为一个方法的参数(函数作为参数传递进方法中)。
使用 Lambda 表达式可以使代码变的更加简洁紧凑。
Lambda表达式的基本语法:
(parameters) -> expression
或
(parameters) ->{ statements; }
以下是lambda表达式的重要特征:
可选类型声明:不需要声明参数类型,编译器可以统一识别参数值。
可选的参数圆括号:一个参数无需定义圆括号,但多个参数需要定义圆括号。
可选的大括号:如果主体包含了一个语句,就不需要使用大括号。
可选的返回关键字:如果主体只有一个表达式返回值则编译器会自动返回值,大括号需要指定明表达式返回了一个数值
Lambda 表达式实例
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)
二:
String[] days = {" Monday", "Tuesday",
"Wednesday", "Thursday",
"Friday", "Saturday",
"Sunday"};
List<String> allDays = Arrays.asList(days);
// 以前的循环方式
for (String allDay : allDays) {
System.out.print(allDay + "; ");
}
// 使用 lambda 表达式以及函数操作(functional operation)
allDays.forEach((allDay) -> System.out.print(allDay + "; "));
// 在 Java 8 中使用双冒号操作符(double colon operator)
allDays.forEach(System.out::println);
以上三种输出结果都是一样
我们平常写的for循环,用到了lambda 表达式,形式会有所不一样,但结果是一样的。代码看起来就高逼格一点了。
//双冒号运算操作符是类方法的句柄,lambda表达式的一种简写
方法调用
person -> person.getAge();
可以替换成
Person::getAge
x -> System.out.println(x)
可以替换成
System.out::println
简单总结一下 Lambda函数的优缺点
优点:简洁,减少代码冗余
缺点:难懂,难以调试
用多了的话,就会习惯了。