この記事は、シアトルコンサルティング株式会社 Advent Calendar 2021の9日目の記事です。
こんにちは、シアトルコンサルティングの村田です。
はじめに
- ラムダ式ってなに
- Javaシルバーの勉強中でラムダ式についての問題が分からない
Javaのラムダ式に関して上記の方を対象にしています。
後半ではJavaシルバーの例題を用いて得点するポイントを解説しています。
1. ラムダ式は実行を代入できる
通常インタフェースはメソッドを実現したクラスを定義しなければなりません。
しかしラムダ式を用いることで、メソッドが1つだけのインタフェース型変数(関数型インタフェース)に実行を代入できます。
Runnable r = () -> {System.out.println("sample");};
■ラムダ式の構文
引数の変数宣言+処理ブロックをアロー演算子「->」でつなぎ、以下のように記述します。
(引数) -> {処理};
関数型インタフェース型の変数に代入するとそのインタフェース型のインスタンスとして動作します。
関数型インタフェースの型 変数名 = (引数) -> {処理};
2. ラムダ式を活用してコードを単純化
■ラムダ式を使用しない場合
public static void main(String[] args) {
List<String> list = List.of("a","b","c","d");
Consumer<String> logic = new Consumer<String>() {
@Override
public void accept(String str) {
System.out.println(str);
}
};
list.forEach(logic);
}
■ラムダ式を利用した場合
public static void main(String[] args) {
List<String> list = List.of("a","b","c","d");
list.forEach((str) -> System.out.println(str));
}
関数型インタフェースを使用する場合はラムダ式を活用することで、定義から実装までを1行で記述できます。
上記のような簡易的なコードであれば、かなり簡略化できます。
3. JavaSilverでの出題形式と解法のポイント
ここからはJavaSilver問題に向けた解き方のコツを説明します。
<例題①>
コンパイルの実行結果として正しいものはどれか。
public void Sample() {
int i = 0;
Supplier<Integer> x = () -> i;
i++;
System.out.print(x.get());
}
<選択肢>
A.コンパイルできるが、何も起きない
B.例外がスローされる
C.0が出力される
D.1が出力される
E.コンパイルエラー → 正解
<解説>
ラムダ式を含むブロックの中では、宣言された変数をラムダ式で使う場合、実質的にはfinalである必要があります。
変数「i」が宣言されたあと、ラムダ式で使用されているにもかかわらずインクリメント(i++)されているためコンパイルエラーになります。
<例題②>
コンパイルの実行結果として正しいものはどれか。
public static void main(String[] args) {
final String hoge = "hello";
Consumer<Integer> x = (hoge) -> System.out.print(hoge);
x.accept("thanks");
}
<選択肢>
A.「hello」が出力される
B.「thanks」が出力される
C.何も出力されない
D.コンパイルエラー → 正解
E.例外がスローされる
<解説>
このプログラムでの注目ポイントは宣言している変数名です。
ラムダ式内の「(hoge) -> 」の部分は正確には「(String hoge) ->」と引数宣言のデータ型を省略した形になっています。
2行目にfinalで宣言しているhogeとラムダ式内で宣言しているhogeが重複しているためコンパイルエラーになります。
さいごに
Javaシルバー学習のお供として分からなかったことをまとめました。
Javaシルバーで得点するためにはコンパイルエラーになるケースを覚えることが近道になります。
選択肢を絞るための一助としていただければと思います。
参考
(1) 志賀澄人 徹底攻略Java SE 11 Silver 問題集[1Z0-815]対応 株式会社インプレス 2019