Lambda表达式在Java中是函数式编程的一种体现,允许把函数作为一个方法的参数传递进方法中,或者将函数作为方法的返回值。
1. 语法和基础使用
语法:
// Lambda实现是一个简单的表达式
(parameters) -> expression;
// Lambda实现是一个函数体
(parameters) -> {statements;}
- parameters是参数列表,如果没有参数,则需要使用一个空括号
() -> ...
。 - 如果只有一个参数,则可以不用括号
parameter -> ...
(推荐),也可以使用括号(parameter) -> ...
。 - 如果有多个参数,则正常使用参数列表即可
(parameter1, parameter2, ...) -> ...
。 - 由于java中对于Lambda表达式的类型推断机制,其中的parameter可以声明参数类型,也可以不用,如
(int parameter) -> ...
。
示例1:只有一个参数,函数主体是简单表达式。
List<String> names = Arrays.asList("zhangsan", "lisi", "wangwu");
// 单参数 + 简单表达式,也是将Lambda表达式作为函数传递给方法
names.forEach(name -> System.out.println(name));
示例2:使用Lambda表达式实现函数式接口,并作为参数传入方法。
public class Main {
public static void main(String[] args) {
// 使用Lambda表达式实现接口
AddOperation addOperation = (a, b) -> System.out.println(a + b);
// 执行对应的接口方法
addOperation.operate(1, 2);
// 将Lambda表达式作为参数传入方法
Main.add_operate(3, 4, addOperation);
}
/**
* 定义一个接口
*/
interface AddOperation {
void operate(int a, int b);
}
/**
* 将接口作为参数类型
*/
public static void add_operate(int a, int b, AddOperation addOperation) {
addOperation.operate(a, b);
}
}
函数式接口: 能用Lambda表达式实现的接口必须是函数式接口,即内部只有一个抽象方法的接口。可以使用注解@FunctionalInterface来标识该接口,如果该接口不满足函数式接口的定义则会报错,例如接口中有两个抽象方法。
2. 变量作用域
Lambda表达式中使用的局部变量,是隐式的final类型,即不可以在表达式后再修改该变量的值。以下示例会报编译错误:
public class Main {
public static void main(String[] args) {
int b = 1;
// b为隐式的final类型,不允许在Lambda后面再修改b的值
// 此处IDE会提示:variable used in lambda expression should be final or effectively final
AddOperation addOperation = a -> System.out.println(a + b);
b = 3;
addOperation.operate(2);
}
/**
* 定义一个接口
*/
interface AddOperation {
void operate(int a);
}
}
Lambda表达式中的参数定义也不能和局部变量的参数名称同名,以下示例会报编译错误:
public class Main {
public static void main(String[] args) {
int b = 1;
int c = 2;
// 此处Lambda表示的参数b和局部变量的名称相同,编译会报错
// IDE也会提示:Variable 'b' is already defined in the scope
AddOperation addOperation = b -> System.out.println(b + c);
addOperation.operate(2);
}
/**
* 定义一个接口
*/
interface AddOperation {
void operate(int a);
}
}
标签:Java,int,addOperation,接口,operate,表达式,Lambda
From: https://www.cnblogs.com/guyuyun/p/18033409