关于java的lambda

本文深入探讨了Java中Lambda表达式的实现原理,通过具体示例解释了Lambda如何被编译器转换为等效的匿名内部类,展示了底层MethodHandle和LambdaMetafactory的使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

先看一段代码

public class Lambda {
	public static void main(String[] args) {
                System.setProperty("jdk.internal.lambda.dumpProxyClasses", ".");
		Function<Integer, String> fun1 = String::valueOf;
		Function<String, Integer> fun2 = String::length;
		System.out.println(fun1.apply(1));
		System.out.println(fun2.apply("hello"));
	}

}

 那么,javac为我们做了什么呢?等价与那些代码呢?

对于第一种为

	public static void main(String[] args) throws Throwable {
        MethodHandles.Lookup caller = MethodHandles.lookup();
        String invokedName = "apply";
        MethodType invokedType = MethodType.methodType(Function.class);
        MethodHandle implMethod = caller.findStatic(String.class, "valueOf", 
        		MethodType.methodType(String.class,int.class));
        MethodType instantiatedMethodType = MethodType.methodType(String.class,int.class);
        CallSite site = LambdaMetafactory.metafactory(caller,
        					      invokedName, 
                                                      invokedType, 
                                                      instantiatedMethodType.generic(),
                                                      implMethod, 
                                                      instantiatedMethodType);
        MethodHandle factory = site.getTarget();
        Function<Integer,String> fun1 = (Function<Integer,String>) factory.invoke();
        System.out.println(fun1.apply(1));
	}

 第二种为

        MethodHandles.Lookup caller = MethodHandles.lookup();
        String invokedName = "apply";
        MethodType invokedType = MethodType.methodType(Function.class);
        MethodHandle implMethod = caller.findVirtual(String.class, "length", 
        		MethodType.methodType(int.class));
        MethodType instantiatedMethodType = MethodType.methodType(int.class,String.class);
        CallSite site = LambdaMetafactory.metafactory(caller,
        					      invokedName, 
                                                      invokedType, 
                                                      instantiatedMethodType.generic(),
                                                      implMethod, 
                                                      instantiatedMethodType);
        MethodHandle factory = site.getTarget();
        Function<String,Integer> fun2 = (Function<String,Integer>) factory.invoke();
        System.out.println(fun2.apply("hello"));

 生成的具体类为

第一个

final class Lambda$$Lambda$1
implements Function {
    private Lambda$$Lambda$1() {
    }

    @LambdaForm.Hidden
    public Object apply(Object object) {
        return String.valueOf((Integer)object);
    }
}

 第二个

final class Lambda$$Lambda$2
implements Function {
    private Lambda$$Lambda$2() {
    }

    @LambdaForm.Hidden
    public Object apply(Object object) {
        return ((String)object).length();
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值