lambda
表达式实例
package main.java;
/**
* lambda实例
*/
public class LambdaExample {
public static void main(String[] args) {
//类型声明
MathOperation addition = (int a, int b) -> a + b;
System.out.println("类型声明: "+addition.operation(1,2));
//不用类型声明
MathOperation addition1 = (a,b) -> a+b;
System.out.println("不用类型声明: "+addition.operation(1,2));
// 大括号中的返回语句
MathOperation multiplication = (int a, int b) -> { return a * b; };
System.out.println("大括号中的返回语句: "+multiplication.operation(1,3));
MathOperation getAddition = new MathOperation() {
@Override
public int operation(int a, int b) {
return a+b;
}
};
System.out.println("原来的方式: "+getAddition.operation(1,2));
System.out.println("-----------------------------------------------------------------------------");
// 原来的方式
GreetingService greetService1 = new GreetingService() {
@Override
public void sayMessage(String message) {
System.out.println("hello "+message);
}
};
greetService1.sayMessage("咖啡");
//不用括号
GreetingService greetingService = message -> System.out.println("hello " + message);
greetingService.sayMessage("大锤");
//用括号
GreetingService greetService2 = (message) -> System.out.println("hello " + message);
greetService2.sayMessage("春江");
}
interface GreetingService {
void sayMessage(String message);
}
interface MathOperation {
int operation(int a, int b);
}
}
变量作用域
package main.java;
/**
* lambda作用域
* lambda 表达式只能引用标记了 final 的外层局部变量,这就是说不能在 lambda 内部修改定义在域外的局部变量,否则会编译错误。
*/
public class LambdaScope {
//不必声明为final
private static String salutation = "Hello! ";
// private final static String salutation = "Hello! ";
public static void main(String[] args) {
GreetingService greetingService = message -> System.out.println(salutation + message);
GreetingService greetingService1 = new GreetingService() {
@Override
public void sayMessage(String message) {
salutation = salutation + "春江";
System.out.println(salutation + message);
}
};
greetingService1.sayMessage("大锤");
// GreetingService greetingService = message -> salutation = salutation + message ;
//在 Lambda 表达式当中不允许声明一个与局部变量同名的参数或者局部变量。
// String salutation = "";
// GreetingService greetingService2 = salutation -> System.out.println(salutation+"111");
salutation = salutation + "春江";
greetingService.sayMessage("大锤");
}
interface GreetingService{
void sayMessage(String message);
}
}
在匿名类内可以修改,在lambda里面不能修改,加了final则两个都不能修改。我们也可以直接在 lambda 表达式中访问外层的局部变量。lambda 表达式的局部变量可以不用声明为 final,但是必须不可被后面的代码修改(即隐性的具有 final 的语义),在 Lambda 表达式当中不允许声明一个与局部变量同名的参数或者局部变量。


浙公网安备 33010602011771号