通过Lambda定义的函数式接口实现对象如何命名?称其为匿名类是否正确?
问题解答
首先给出明确结论:你代码里通过Lambda表达式生成的函数式接口对象,称作匿名类实例是完全不准确的,二者有本质区别。
正确称呼方式
可以按照场景选择以下称呼:
- 最通用严谨的说法:
IntBinaryOperator接口实例 / 函数式接口实例 - 贴合语法特性的说法:Lambda实例
- 日常开发简化说法:直接按功能叫「乘法运算实例」这类指代性称呼也可以,只要交流双方能理解即可
为什么不能叫匿名类
匿名类是Java 1.1版本就存在的旧语法,如果用匿名类实现相同逻辑,代码是这样的:
IntBinaryOperator multiply = new IntBinaryOperator() { @Override public int applyAsInt(int a, int b) { return a * b; } };
这段代码编译后会额外生成Lambdas$1.class的字节码文件,也就是匿名类的编译产物。
而你写的(a, b) -> a * b是Java 8引入的Lambda语法,编译后不会生成额外的class文件,运行期JVM会通过invokedynamic指令动态生成对应的接口实现实例,底层实现逻辑和匿名类完全不同,二者是完全独立的语法特性,不能混为一谈。
内容的提问来源于stack exchange,提问作者pushpa
相关产品推荐
相关产品推荐

