java8新特性之lambda表达式
lambda表达式
内容
Java8 Lambda 表达式
说明
- Lambda 表达式,也可称为闭包,它是推动 Java 8 发布的最重要新特性。
- Lambda 允许把函数作为一个方法的参数(函数作为参数传递进方法中)。
- 使用 Lambda 表达式可以使代码变的更加简洁紧凑。
语法
(参数) -> 表达式
或
(参数) ->{ 语句块; }
lambda表达式的重要特征
- 可选类型声明:不需要声明参数类型,编译器可以统一识别参数值。
- 可选的参数圆括号:一个参数无需定义圆括号,但多个参数需要定义圆括号。
- 可选的大括号:如果主体包含了一个语句,就不需要使用大括号。
- 可选的返回关键字:如果主体只有一个表达式返回值则编译器会自动返回值,大括号需要指定表达式返回了一个数值。
lambda表达式实例
简单实例
以代码为例:
//没有声明类型,没有大括号,只有一个表达式----只有一个表达式会根据表达式默认返回,如:a+b返回a+b的结果,System.out.println("无返回")返回类型为void
MathOperation mathOperation1 = (a,b) -> a+b ;
System.out.println(mathOperation1.operation(1,22));
//有声明类型,没有大括号,只有一个表达式
MathOperation mathOperation2 = (int a,int b) -> a-b ;
System.out.println(mathOperation2.operation(1,2));
//没有声明类型,有大括号----有大括号时,不会默认返回,需要指定返回类型,不指定放回类型是void
MathOperation mathOperation3 = (a,b) -> { return a*b; };
System.out.println(mathOperation3.operation(2,5));
//有声明类型,有大括号
MathOperation mathOperation4 = (int a,int b) -> { return a/b; };
System.out.println(mathOperation4.operation(4,3));
//只有一个参数,无大括号,只有一个表达式,返回类型为空----只有一个参数可以省略(),多个参数不能省略
PrintlnNew printlnNew1 = s -> System.out.println(s);
printlnNew1.println("只有一个参数,无大括号,只有一个表达式,返回类型为空----只有一个参数可以省略(),多个参数不能省略");
//有大括号,返回类型为空
PrintlnNew printlnNew2 = (s) -> {
System.out.println(s);
};
printlnNew2.println("有大括号,返回类型为空");
//无参数时需要()
NoParameter noParameter = () -> System.out.println("无参数时需要()");
noParameter.println();
代码中的接口:
interface MathOperation{
int operation(int a,int b);
}
interface PrintlnNew{
void println(String s);
}
interface NoParameter{
void println();
}
脚本运行结果:
使用 Lambda 表达式需要注意以下两点:
- Lambda 表达式主要用来定义行内执行的方法类型接口,例如,一个简单方法接口。在上面例子中,我们使用各种类型的Lambda表达式来定义MathOperation接口的方法。然后我们定义了sayMessage的执行。
- Lambda 表达式免去了使用匿名方法的麻烦,并且给予Java简单但是强大的函数化的编程能力。
变量作用域
- lambda 表达式只能引用标记了 final 的外层局部变量,这就是说不能在 lambda 内部修改定义在域外的局部变量,否则会编译错误。
final String hello = "Hello";
PrintlnNew printlnNew5 = (String str) ->{
System.out.println(hello+" "+str);
};
printlnNew5.println("boy");
- lambda 表达式的局部变量可以不用声明为 final,但是必须不可被后面的代码修改(即隐性的具有 final 的语义)
String hello1 = "Hello";
//前面修改编译也会报错
hello1="Hello2"; //加此处后面lambda表达式会编译出错
PrintlnNew printlnNew6 = str -> System.out.println(hello1 + " " + str);
printlnNew6.println("girl");
//被后面修改编译会报错
hello1="Hello2"; //加此处前面lambda表达式会编译出错
因此在lambda表达式中引用的外部变量是不可被修改的
3. 在lambda表达式中不允许声明一个与外部变量同名的参数或局部变量
String name = "Idris";
//参数与外部变量同名会编译报错
PrintlnNew printlnNew7 = (name)-> System.out.println(name);
//局部变量与外部变量同名会编译报错
PrintlnNew printlnNew8 = () -> {
String name = "Gane";
System.out.println(name);
};
文章说明
本系列只为记录学习成果与内容,如有雷同实属无意