最初に
この記事は、以下の書籍を通じてJava silverの合格に向けて自分が学んだ内容を体系的にアウトプットする記事である。(目指せ年始合格!)
徹底攻略Java SE 11 Silver問題集[1Z0-815]対応
勉強記録
ラムダ式
省略ルール
省略部分 | 省略の条件 |
---|---|
引数の型 | 省略する場合は、全引数の型を省略する |
引数の() | 引数が1つの時のみ省略可能 |
メソッドの{} | 処理が一文の時のみ省略可能。戻り値がある場合、returnの省略とセット |
return | メソッドの{}の省略とセット |
- returnと{}のどちらかだけを省略することはできない
- 参考)【Java】ラムダ式の省略方法まとめ
ラムダ式の外で宣言されたローカル変数にアクセスする場合
-
実質的にfinalな変数(finalで修飾されていなくても変更されない変数)にしかアクセスできない。
- NG例①
public class Test{ public static void main(String[] args){ String val = "hello world"; Function f = () -> { //コンパイルエラー val = "hello Japan"; System.out.println(val); } f.test(); } }
- NG例②
public class Test{ public static void main(String[] args){ String val = "hello world"; Function f = () -> { System.out.println(val); } //コンパイルエラー val = "hello Japan"; f.test(); } }
-
参照型変数の場合、変数が指すインスタンスを変えなければ、中身は変えてOK
import java.util.function.Consumer;
class LambdaTest {
public static void main(String[] args) {
final int[] i = {0, 1, 2};
System.out.println(i[1]); // → 1
Consumer<?> consumer = x -> {
i[1] = 256;
};
consumer.accept(null);
System.out.println(i[1]); // → 256!
}
}
感想
- ラムダ式の外で宣言されたローカル変数にアクセスする場合実質的にfinalな値でないといけないというルール、なぜこのルールが必要なのかがまだよくわかっていない。以下サイトなどを見て、スコープの問題っぽいがよくわからんな。(おいおい調べる)