Java - 功能界面"杠杆"对于lambda表达式?

时间:2015-08-13 20:15:35

标签: java lambda java-8

我的陈述?

有我的代码:

public void start() {
    Consumer<Integer> someFunc = (someInt) -> {
        System.out.println("Hello lambda!");
    };
}

我的代码有字节码:

〜开始方法

  // 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表达式

  // 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表达式已转换为静态方法。那么,我可以说功能界面是&#34;杠杆&#34; 静态方法允许我调用吗?

1 个答案:

答案 0 :(得分:4)

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

如果使用::表示法,则不需要其他方法,并且将在运行时生成lambda以调用::method

  

所以,我可以说功能界面是&#34;杠杆&#34;对于允许我调用它的静态方法?

你可以称之为&#34;杠杆&#34;如果你喜欢。它可能被称为bridging函数。正如@Dici所指出的,javap使用的术语是&#34; bootstrap method&#34;注意:这些引导方法在元数据中存储为字符串,并且不会在反射中显示为Method,也不会通过ASM(JVM在内部使用的库)显示为字节代码.ASM将它们视为元数据