java &d8中Lambda的实现原理

基础概念

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
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值