Java 为什么增量运算符lambda编译为可运行?
有以下代码:Java 为什么增量运算符lambda编译为可运行?,java,lambda,java-8,Java,Lambda,Java 8,有以下代码: static int counter = 0; static Callable<?> callable = () -> counter; static Runnable runnable = () -> counter++; static Runnable runnable2 = () -> counter; // DOES NOT COMPILE public static void main(String[] args) throws Ex
static int counter = 0;
static Callable<?> callable = () -> counter;
static Runnable runnable = () -> counter++;
static Runnable runnable2 = () -> counter; // DOES NOT COMPILE
public static void main(String[] args) throws Exception {
runnable.run();
System.out.println(callable.call()); // PRINTS "1"
}
静态整数计数器=0;
静态Callable Callable=()->计数器;
静态Runnable Runnable=()->计数器++;
静态可运行runnable2=()->计数器;//不编译
公共静态void main(字符串[]args)引发异常{
runnable.run();
System.out.println(callable.call());//打印“1”
}
我理解为什么runnable2不编译——因为lambda返回一个值,而runnable没有返回类型(为void)。我也理解为什么可调用编译,它返回计数器变量值,该值通过调用run方法递增。(我知道它是单线程的,但这不是重点)
我不明白的是为什么
runnable
lambda会编译?据我所知,++运算符确实返回一个值-递增的值-为什么编译器会忽略它?如果您使用的是method()
,而不是counter++
,会怎么样?如果method
返回一个值怎么办?仍然编译。counter
是一个表达式,counter++
同时是一个表达式和语句。在副本中,如果您按照ExpressionStatement
的链接,您将找到增量表达式。旁注:在正常方法中也会发生类似情况:counter代码>是一个错误,计数器++代码>正常