首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java --函数接口是lambda表达式的“杠杆”吗?

Java --函数接口是lambda表达式的“杠杆”吗?
EN

Stack Overflow用户
提问于 2015-08-13 20:15:34
回答 1查看 226关注 0票数 1

我的陈述是真的吗?

这是我的密码:

代码语言:javascript
复制
public void start() {
    Consumer<Integer> someFunc = (someInt) -> {
        System.out.println("Hello lambda!");
    };
}

还有我的代码的字节码:

~启动法

代码语言:javascript
复制
  // access flags 0x1
  public start()V
   L0
    LINENUMBER 9 L0
    INVOKEDYNAMIC accept()Ljava/util/function/Consumer; [
      // handle kind 0x6 : INVOKESTATIC
      java/lang/invoke/LambdaMetafactory.metafactory(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;
      // arguments:
      (Ljava/lang/Object;)V, 
      // handle kind 0x6 : INVOKESTATIC
      me/alexandr/SomeMainClass.lambda$start$0(Ljava/lang/Integer;)V, 
      (Ljava/lang/Integer;)V
    ]
    ASTORE 1
   L1
    LINENUMBER 12 L1
    ALOAD 1
    ICONST_1
    INVOKESTATIC java/lang/Integer.valueOf (I)Ljava/lang/Integer;
    INVOKEINTERFACE java/util/function/Consumer.accept (Ljava/lang/Object;)V
   L2
    LINENUMBER 13 L2
    RETURN
   L3
    LOCALVARIABLE this Lme/alexandr/SomeMainClass; L0 L3 0
    LOCALVARIABLE someFunc Ljava/util/function/Consumer; L1 L3 1
    // signature Ljava/util/function/Consumer<Ljava/lang/Integer;>;
    // declaration: java.util.function.Consumer<java.lang.Integer>
    MAXSTACK = 2
    MAXLOCALS = 2

~翻译lambda表达式

代码语言:javascript
复制
  // access flags 0x100A
  private static synthetic lambda$start$0(Ljava/lang/Integer;)V
   L0
    LINENUMBER 10 L0
    GETSTATIC java/lang/System.out : Ljava/io/PrintStream;
    LDC "Hello lambda!"
    INVOKEVIRTUAL java/io/PrintStream.println (Ljava/lang/String;)V
   L1
    LINENUMBER 11 L1
    RETURN
   L2
    LOCALVARIABLE someInt Ljava/lang/Integer; L0 L2 0
    MAXSTACK = 2
    MAXLOCALS = 1

据我所见-一个lambda表达式被翻译成一个静态方法。那么,我可以说函数接口是静态方法的“杠杆”,允许我调用它吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-08-13 21:23:48

如果使用->表示法,实现代码的实际方法将放置在“静态方法”中。在运行时创建的lambda将调用此方法。

如果使用::表示法,则不需要额外的方法,将在运行时生成lambda以调用::method

那么,我可以说函数接口是静态方法的“杠杆”,它允许我调用它吗?

你可以叫它“杠杆”,如果你愿意。它可能被称为桥接函数。正如@Dici所指出的,javap使用的术语是"自举法“--注意:这些引导方法在元数据中存储为String,在反射中没有以Method的形式出现,也没有通过ASM ( JVM内部使用的库)在字节代码中出现。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31997609

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档