先看一段代码
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(); } }
相关推荐
java lambda 表达式中文详解(语言篇和类库篇),更方便更快捷了解java lambda表达式
java8lambda表达式的安卓Studio工程Demo,供初步学习使用
JAVA新特性Lambda的演示,让你通过实例,短时间内搞清什么是Lambda表达式及其用法。
在了解Lambda表达式之前我们先来区分一下面向对象的思想和函数式编程思想的区别 面向对象的思想: 做一件事情,找一个能解决这个事情的对象,调用他的方法来解决 函数时编程思想: 只要能获取到结果,谁去做的都不...
Java 1.8 lambda表达式示例源码
( 13-Java-8-Lambda-Expressions-Part-1.pdf ) java 8 lambda- expressions 学习资料,例子。练习 java example
JAVA lambda表达式
——学习参考资料:仅用于个人学习使用! 本代码仅作学习交流,切勿用于商业用途,否则后果自负。若涉及侵权,请联系,会尽快处理! 未进行详尽测试,请自行调试!
● 为何需要lambda,它将如何改变Java编程 ● lambda表达式语法 ● 流与管道的基本操作 ● 使用收集器与汇聚来终止管道 ● 创建流 ● 分割迭代器、fork/join框架与异常 ● 使用微基准测试检查流的性能 ● ...
Lambda表达式的学习在于 ,在实践中学习,在实践中理解。建议大家还是多写代码,多使用
Lambda将从根本上改变我们开发Java程序的方式,对于JAVA程序员来说是很不错的。
像这样的日志代码会更好: if (log.isLoggable(Level.FINE)) { ...关于这个主题有大量优秀的资源,相关的方法和工具也不只针对Java。假定你已经完成了分析,并且判断出是运行环境中Java 组件的性能需要改善。
关于Java中lambda的表达式,Java多核编程,清华大学(出版)
走进Java Lambda
java lambda表达式,lambda 表达式基本上表达了函数式接口的实例(具有单一抽象方法的接口称为函数式接口。一个例子是 java.lang.Runnable)。lambda 表达式实现了唯一的抽象函数,因此实现了函数式接口 lambda ...
Java8的lambda表达式
Java 8新特性之Lambda与函数式编程.pdf
主要介绍了Java lambda 循环累加求和代码,具有很的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
一个lambda interpreter主要由一下几个方面构成: 1.词法分析器(Lexer):将字符流分解为符号流(token流) 2.语法分析器(Parser):根据语法,利用符号流构建抽象语法树AST 3.语法解释器/语法制导的翻译...
java lambda函数式编程完成实例代码,看完代码,基本上就会用lambda 了