交換しました s
次のラムダ式を次のようにました_
:
s -> Integer.parseInt(s)
Eclipseコンパイラは言う:
'_'は、ソースレベル1.8以降の予約キーワードであるため、識別子として使用しないでください。
JLS§3.9字句構造/キーワードには説明がありません。
回答:
見るべき場所はJLS§15.27.1です。ラムダパラメータ
ラムダパラメータの名前が_(つまり、1つのアンダースコア文字)の場合は、コンパイル時エラーです。
コンテキストで変数名_を使用することはお勧めしません。Javaプログラミング言語の将来のバージョンでは、この名前をキーワードとして予約したり、特別なセマンティクスを与えたりする可能性があります。
そのため、ラムダパラメータに対してエラーが生成されたとき、または他の_
識別子に対して警告が生成されたとき、特に同じメッセージが両方の場合に使用されるため、Eclipseメッセージは誤解を招く可能性があります。
enum
とassert
法的な識別子は...だった
JEP 302のフェーズ2です。ラムダ式で未使用のパラメーターを示すために、アンダースコアを特殊文字として追加します。
アンダースコアの扱い
多くの言語では、アンダースコア(
_
)を使用して、名前のないラムダパラメーターを示します(メソッドおよび例外パラメーターの場合も同様)。
BiFunction<Integer, String, String> biss = (i, _) -> String.valueOf(i);
これにより、未使用の引数の静的チェックを強化でき、複数の引数を未使用としてマークすることもできます。ただし、アンダースコアはJava 8の時点で有効な識別子であったため、互換性のために、アンダースコアがJavaでこの役割を果たすことができる場所に到達するために、より間接的なパスを使用する必要がありました。フェーズ1では、アンダースコアをJava 8のラムダ仮パラメーター名として禁止し(以前はラムダが存在しなかったため、互換性への影響はありませんでした)、他の場所で識別子としてアンダースコアを使用することに対して警告が発行されました。この警告がエラーになったとき、フェーズ2はJava 9で登場しました。アンダースコアの計画されたリハビリを自由に完了して、未使用のラムダ、メソッド、またはキャッチの仮パラメーターを示すことができます。
$
この目的で使用しています。
Java SE 9のJava言語の変更 https://docs.oracle.com/javase/9/language/toc.htm#JSLAN-GUID-16A5183A-DC0D-4A96-B9D8-AAC9671222DD
Java 9以降、ラムダコンテキスト内だけでなく、_文字を識別子として使用できなくなりました
下線文字は正式な名前ではありません。
アンダースコア( "_")識別子を使用すると、ソースコードをコンパイルできなくなります。
_
は、ラムダパラメータ名だけでなく、正当な識別子名としても許可されないことに注意してください。これは、実際には、ビルド43で修正されました:bugs.openjdk.java.net/browse/JDK-8061549