0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

シアトルコンサルティング株式会社Advent Calendar 2021

Day 9

[JavaSilver受験対策] 誰も解けないラムダ式を解説

Last updated at Posted at 2021-12-08

この記事は、シアトルコンサルティング株式会社 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

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?