我正在用 Java 练习 lambda 表达式。根据 Java SE 16 Lambda Body的 Oracle 文档,我知道局部变量需要是 final 或有效 final 的:
任何使用但未在 lambda 表达式中声明的局部变量、形式参数或异常参数必须是 final 或有效 final (§4.12.4),如 §6.5.6.1 中所述。
但它没有说为什么。搜索我发现了这个类似的问题为什么 lambdas 中的变量必须是最终的或有效的最终?,其中 StackOverflow 用户“snr”回复了下一个引用:
到目前为止,Java 中的局部变量不受竞争条件和可见性问题的影响,因为它们只能被执行声明它们的方法的线程访问。但是一个 lambda 可以从创建它的线程传递到另一个线程,因此如果由第二个线程评估的 lambda 被赋予改变局部变量的能力,那么这种免疫力就会丧失。
这就是我的理解:一个方法一次只能由一个线程(比如说 thread_1)执行。这确保该特定方法的局部变量仅由 thread_1 修改。另一方面,可以将 lambda 传递给不同的线程 (thread_2),因此...如果 thread_1 完成 lambda 表达式并继续执行方法的其余部分,则它可能会更改局部变量的值,并且,在同时,thread_2 可能会更改 lambda 表达式中的相同变量。然后,这就是存在此限制的原因(局部变量需要是 final 或有效 final 的)。
对不起,很长的解释。我做对了吗?
但接下来的问题是:
我对Java没有太多经验。对不起,如果我的问题有明显的答案。
抱歉问这个问题,我不知道该怎么问。基本上我正在使用逻辑运算符练习 JavaScript。我有一个非常简单的 HTML 代码:
<body> <script src="logic_operators.js"></script> </body>
文件“logic_operators.js”有以下几行代码:
let value1 = true;
let value2 = false;
document.write(value1 && value2 + '<br/>');
document.write(value1 || value2 + '<br/>');
document.write(!value1 + '<br/>');
document.write(!value2 + '<br/>');
Run Code Online (Sandbox Code Playgroud)
基本上,每个document.write()句子用新行写出每个逻辑操作数的结果。
它适用于除 OR ( || ) 之外的每个句子,它不打印新行。我得到下一个结果:
false
truefalse
true
Run Code Online (Sandbox Code Playgroud)
我需要使用括号将 OR 操作括起来才能使句子起作用:
document.write((value1 || value2) + '<br/>');
这是为什么?我是 JavaScript 的新手,无法真正弄清楚这一点。