Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/382.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java IntConsumer返回函数.identity().apply()的编译器问题_Java_Lambda_Java 8_Functional Programming - Fatal编程技术网

Java IntConsumer返回函数.identity().apply()的编译器问题

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始终是一个表达式

像这样声明IntConsumer:

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:“通过计算表达式来执行表达式语句;如果表达式有值,则该值将被丢弃。”