介绍:
Lambda 表达式,也可称为闭包,它是推动 Java 8 公布的最重要新个性。
Lambda 容许把函数作为一个办法的参数(函数作为参数传递进办法中)。
应用 Lambda 表达式能够使代码变的更加简洁紧凑。
语法:
(parameters) -> expression
或
(parameters) ->{statements;}
个性:
- 可选类型申明:不须要申明参数类型,编译器能够对立辨认参数值。
- 可选的参数圆括号:一个参数无需定义圆括号,但多个参数须要定义圆括号。
- 可选的大括号:如果主体蕴含了一个语句,就不须要应用大括号。
- 可选的返回关键字:如果主体只有一个表达式返回值则编译器会主动返回值,大括号须要指定明表达式返回了一个数值。
实例:
package com.cy;
import org.omg.Messaging.SyncScopeHelper;
import java.sql.SQLOutput;
public class lambdatest {
interface MathOperation{int operation(int a,int b);
}
interface GreetingService{void sayMessage(String name);
}
private int operation(int a,int b,MathOperation mathOperation){return mathOperation.operation(a, b);
}
public static void main(String[] args) {
// 类型申明
MathOperation addtion=(int a,int b)->a+b;
// 一般用法
class Addtest implements MathOperation{
@Override
public int operation(int a, int b) {return a+b;}
}
// 不必类型申明
MathOperation subtraction=(a,b)->a-b;
// 大括号中的返回语句
MathOperation multiplication=(a,b)->{return a*b;};
// 没有大括号及返回语句
MathOperation division=(a,b)->a/b;
System.out.println("10+5="+new Addtest().operation(10, 5));
System.out.println("10+5="+new lambdatest().operation(10, 5, addtion));
System.out.println("10 - 5 =" + new lambdatest().operation(10, 5, subtraction));
System.out.println("10 x 5 =" + new lambdatest().operation(10, 5, multiplication));
System.out.println("10 / 5 =" + new lambdatest().operation(10, 5, division));
// 不必括号
GreetingService greetingService=message->
System.out.println(message);
greetingService.sayMessage("我是 lambda 表达式");
}
}
后果:
"C:\Program Files\Java\jdk1.8.0_161\bin\java.exe" "-javaagent:E:\IntelliJ IDEA\lib\idea_rt.jar=61573:E:\IntelliJ IDEA\bin" -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.8.0_161\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\rt.jar;E:\ideaprogectworkspace\GitIII2012\out\production\01java" com.cy.lambdatest
10+5=15
10+5=15
10 - 5 = 5
10 x 5 = 50
10 / 5 = 2
我是 lambda 表达式
留神点:
Lambda 表达式次要用来定义行内执行的办法类型接口,例如,一个简略办法接口
Lambda 表达式免去了应用匿名办法的麻烦,并且给予 Java 简略然而弱小的函数化的编程能力
变量作用域:
lambda 表达式只能援用标记了 final 的外层局部变量,这就是说不能在 lambda 外部批改定义在域外的局部变量,否则会编译谬误
咱们也能够间接在 lambda 表达式中拜访外层的局部变量
lambda 表达式的局部变量能够不必申明为 final,然而必须不可被前面的代码批改(即隐性的具备 final 的语义)
在 Lambda 表达式当中不容许申明一个与局部变量同名的参数或者局部变量