Java IntConsumer返回函数.identity().apply()的编译器问题
像这样声明IntConsumer:Java IntConsumer返回函数.identity().apply()的编译器问题,java,lambda,java-8,functional-programming,Java,Lambda,Java 8,Functional Programming,像这样声明IntConsumer: int z = 0; IntConsumer iConsumer = (a) -> z; 给出编译错误:“Void方法无法返回值”正常 但就像这样: int z = 0; IntConsumer iConsumer = (a) -> Function.identity().apply(z); 当Function.identity().apply(z)返回一个对象时,这里没有编译错误。 不应该也给出编译错误吗?z始终是一个表达式
int z = 0;
IntConsumer iConsumer = (a) -> z;
给出编译错误:“Void方法无法返回值”正常
但就像这样:
int z = 0;
IntConsumer iConsumer = (a) -> Function.identity().apply(z);
当Function.identity().apply(z)
返回一个对象时,这里没有编译错误。
不应该也给出编译错误吗?z
始终是一个表达式
Function.identity().apply(z)
is。它可以用作表达式,因为它返回一个值。但只要忽略该值,它就会被解释为一条语句
通过计算表达式执行表达式语句;如果表达式有值,该值将被丢弃。
IntConsumer#accept(int值)
期望返回void
。对于单行lambda主体,它必须是语句
比较
// not allowed - expressions
IntConsumer a = (i) -> 2 + 2;
IntConsumer b = (i) -> true ? 1 : 0;
IntConsumer c = (i) -> (Function.identity().apply(i));
IntConsumer d = (i) -> (System.out.println(i));
IntConsumer e = (i) -> (new Object());
// allowed - expression statements
IntConsumer f = (i) -> Function.identity().apply(i);
IntConsumer g = (i) -> System.out.println(i);
IntConsumer h = (i) -> new Object();
这是一个函数,而不是您提到的问题所描述的“特殊”语句。一个函数,其中:“R apply(T)”方法将始终返回R(不是void),因此编译器在编译时检查此方法是否永远不会返回void,那么为什么它接受为有效并“忘记”返回的值?@fidudidu我的帖子没有回答您的问题吗Function.identity().apply(z)
是一个表达式语句(特别是一个方法调用语句)。来自JLS:“通过计算表达式来执行表达式语句;如果表达式有值,则该值将被丢弃。”