Tips

java8のlambda式での_の扱い

java8のlambda式での_の扱い

java8のlambda式での_の扱い

java8のlambdam式での_の扱い

前置き

eclipse 4.6 Neonでlambda式を使ったサンプルプログラムを書いていたら突然エラーを吐かれたので忘備録代わりにメモ。

開発環境は下記参照。

開発環境

PC:MacBook Pro 2011early 15inch

OS: Windows8.1

JDK: Java SE 8u102

IDE: eclipse 4.6(Neon)、pleiades導入済み

メモリ:16GB(8GB x 2)

CPU:Core i7-2635QM 2.00GHz

 

謎のコンパイルエラー

ことの発端は、以下のコードを改造した時の事。

SampleCode.java

import java.util.function.Predicate;

public class SampleCode {
   public static void main(String[] args) {
     Predicate pre = t -> t.equals("Hello");
     System.out.println(pre.test("Hello"));
   }
}

実行結果

true

このコードの変数名を t を _ に変更したところ、

error_code

と表示されてコンパイルエラーになってしまった。(変更後のソースは↓)

SampleCode.java(変更後)

import java.util.function.Predicate;

public class SampleCode {
   public static void main(String[] args) {
     Predicate pre = _ -> _.equals("Hello");
     System.out.println(pre.test("Hello"));
   }
}

エラー内容にキーワード(予約語)と書いてあるので、変数名として_がつけられなくなったのかと思い、以下のコードをコンパイルしたところなぜか実行できてしまった。
(ただし、警告は出る。)

SampleCode.java

public class SampleCode {
  public static void main(String[] args) {
    int _ = 10;
    System.out.println(_);
  }
}

実行結果

10
あれっ??実行できるぞ? 予約語なら変数名にできないはずなのに、なぜ? の_の

 

java8のlambda式での_の扱い

気になって調べてみたところ、オラクルのドキュメント(http://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.27.1 2015年02月13日付)に、以下の記述を発見。

※閲覧日時:2016/09/05 14:00

(中略)

It is a compile-time error if a lambda parameter has the name _ (that is, a single underscore character).

The use of the variable name _ in any context is discouraged. Future versions of the Java programming language may reserve this name as a keyword and/or give it special semantics.

(後略)

 

直訳※すると、

「もしlambdaの変数名が_(アンダースコア1文字)の場合、コンパイルエラーです。

任意の変数名に_を付けることは推奨されません。将来のjavaのバージョンではこの名前(_)はキーワードになったり、特別な意味が割り当てられるかもしれません。」

となる。

_ 1文字の変数名はラムダ式には使えないものの、まだキーワードはないというこなので、普通の変数名には使えてしまったということか。

※訳は厳密ではないので、厳密性が必要な場合はご自分でお調べください。

 

おまけ

 

現在javaでは _ は予約語ではないものの、ほかの言語ではラムダ式で記述する際に _ が意味を持っている場合もあるため、混乱を避けるための措置、ということだと思われます。

なので、_ という変数名は付けないようにしましょう。

なお、_ 1文字の変数名は避けた方が良いですが、_num や _t などの、_ を含んだ変数名は命名規則に従っていれば利用可能です。コーディング規約をよく見てうまく使い分けてください。

 

ともあれこれでスッキリしたぞ(^^)

やったね!!

 

 

 

 

エラーメッセージなどでよく見かける英単語が苦手な方はこちらの記事もあわせてどうぞ。

今日のIT英語

Lesson1「fatal」

Lesson2「authentication」

Lesson3「permission」

Lesson4「implicitly」

Lesson5「initialize」

Lesson6「What Is an Object?

 

MacのEclipse(Neon)の日本語化の記事はこちらからどうぞ

新連載はじまりました!新Java基礎 連載リンク

はじめてのJAVA 連載

Recent News

Recent Tips

Tag Search