繁体   English   中英

Java-lambda表达式的功能接口是否“有效”?

[英]Java - Is functional interface “lever” for lambda expressions?

我的陈述是真的吗?

有我的代码:

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表达式转换为静态方法 那么,对于可以允许我调用它的静态方法 ,我可以说功能接口是“杠杆”吗?

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

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

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

如果愿意,可以将其称为“杠杆”。 它可能被称为桥接功能。 正如@Dici指出, javap使用的术语是“ 引导程序方法 ”注意:这些引导程序方法以字符串形式存储在元数据中,而不会通过ASM反映为Method或以字节代码形式出现在Method中(JVM使用的库内部),ASM将其视为元数据。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM