基础概念
lambda表达式
lambda是java8加入的语法糖,它是一个匿名函数,即没有声明的方法,它无访问修饰符、无返回值声明和方法名称。语法格式如下:
(arg1, arg2...) -> {
body}
- 当只有一个参数且不声明类型时,可以省略参数的括号。
- 当body部分只有一个语句时,可以省略大括号。
- 参数类型可以显示声明,也可以由编译器自动从上下文推倒。如
(String s) -> System.out.println(s)
函数式接口
在 Java 中,函数式接口(Functional interface)指只有一个抽象方法的接口。可以添加@FunctionalInterface
注解明确设计意图,如果接口中的方法多于一个时,编译时就会产生错误。
lambda表达式可以隐式的分配给功能接口。如Runnable接口的创建,可以写成如下形式:
Runnable r = () -> System.out.println("hello lambda");
又如:
new Thread(
() -> System.out.println("hello runnable");
)
java8 lambda的实现
在JDK,lambda表达式这里使用了invokedynamic
指令,它是java 7引入的新虚拟机指令,也是Java1.0以来第一次引入的新的指令,在java 8中开始正式使用。它与其他invoke指令(invokevirutal,invokestatic, invokeinterface,invokespecial)最大的区别在于它在运行时通过Bootstrap Method简称(BSM)机制动态确定方法所属者和类型。第一次运行时BSM会返回一个调用点(CallSite)对象,并和invokedynamic指令链接,后续调用不再生成CallSite对象和链接操作。
下面我们通过以下示例来看一下java8 中用invokedynamic实现lambda的具体原理。
测试demo
//Java8.java
class Java8 {
interface Logger {
void log(String s);
}
public static void main(String... args) {
myPri