Java - 函数接口(interface) "lever"是否用于 lambda 表达式?

标签 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 表达式 被翻译成一个静态方法。那么,我可以说功能接口(interface)静态方法的“杠杆”,允许我调用它吗?

最佳答案

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

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

So, can I say that functional interface is "lever" for the static method that allow me to call it?

如果你愿意,你可以称它为“杠杆”。它可能被称为 bridging功能。正如@Dici 指出的,javap 使用的术语是“bootstrap method”注意:这些引导方法在元数据中存储为字符串,不会显示为Method通过 ASM(JVM 内部使用的库)在反射或字节码中,ASM 将它们视为元数据。

关于Java - 函数接口(interface) "lever"是否用于 lambda 表达式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31997609/

相关文章:

java - 同步块(synchronized block)是否有最大可重入限制?

java - Android 运行访问

Java 8 : How to go through List with Lambda Expression

Java 8 lambda 错误 : filter stream by reduced filter collection THEN map THEN collect

c# - 将已编译的 Func 方法添加在一起的目的是什么?

java - 创建的 Runnables 的 lambda 的不同行为

java - PrintWriter 未输出到文件

java - 如何使用 Scala 进行 instanceof 检查(测试)

java - 多个图像上传代码不起作用。我缺少什么?

java - 为什么异常完成前调用get()会等待异常执行?