Java 8 lambda实现原理 (面试会问) 表达式的主要应用

1.代替匿名内部类 实现Runnable线程案例    使用() -> {} 替代匿名类:(虽然还有其他的写法但这样写准没错)
public static void testPrimaryBefore(){

    new Thread(new Runnable() {
        public void run() {
            System.out.println(10);
        }
    }).start();

}
public static void testLambda(){
    new Thread(
            () -> {
                System.out.println("1");
            }
    ).start();
}

2.实现List集合遍历

public static void testListErgodicBefore(List li){
    for (String s : li) {
        System.out.println("S:"+s);
    }

}
public static void testListErgodicLambda(List li){
    li.forEach(s -> {
        System.out.println(s);
    });

}

3.使用lambda和函数式接口 (函数式接口待会会写一篇博客贴上链接)

https://blog.csdn.net/qq_38983577/article/details/81806012

最后介绍介绍lambda底层实现原理:

简单来说,

就是代码进行编译时,会自动生成一个私有的静态函数private static void lambda$0(java.lang.String),

这个私有的静态函数干的就是Lambda表达式里面的内容.

编译器会根据Lambda表达式进入这个metafactory类

然后会使Lambda表达式生成了一个内部类并调用lambda$0()。

public static CallSite metafactory(MethodHandles.Lookup caller,
                                       String invokedName,
                                       MethodType invokedType,
                                       MethodType samMethodType,
                                       MethodHandle implMethod,
                                       MethodType instantiatedMethodType)
            throws LambdaConversionException {
        AbstractValidatingLambdaMetafactory mf;
        mf = new InnerClassLambdaMetafactory(caller, invokedType,
                                             invokedName, samMethodType,
                                             implMethod, instantiatedMethodType,
                                             false, EMPTY_CLASS_ARRAY, EMPTY_MT_ARRAY);
        mf.validateMetafactoryArgs();
        return mf.buildCallSite();
}

下面这篇博客写的挺好的

https://www.cnblogs.com/WJ5888/p/4667086.html

你可能感兴趣的:(java基础)