【发布时间】:2015-08-14 15:00:08
【问题描述】:
我的陈述是真实吗?
这是我的代码:
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 表达式 转换为 静态方法。那么,我可以说 功能接口 是 静态方法 的“杠杆”,让我可以调用它吗?
【问题讨论】:
-
我不明白这个问题
-
@Dici 如果我的问题难以理解,我深表歉意。英语——不是我的母语,我发现很难用它清楚地表达自己。如果有人能纠正我的问题,我会很高兴。
-
请注意,它也可以转换为非静态方法。
-
@TagirValeev 嗯。在什么情况下?
-
@Alexandr,这是一个简短的类示例:
public class L {int a;Runnable r = () -> a = 5;}