1
0

More than 1 year has passed since last update.

【Java】なんとなくわかった気になれるラムダ式の解説

Posted at

はじめに

よくわからず使っていたラムダ式ですが、JavaSilver取得を機に自分なりにまとめてみました!

そもそもラムダ式とは?

今まで匿名クラスでできた処理をより簡潔に記述できるようにしたもの(要は書き方のこと!)

で、匿名クラスって何?

匿名クラスとはインタフェース実行のステップを簡潔にしたもの。

従来、インタフェースの実行は①インタフェースの作成→②インタフェースの実装用のクラスを作成→③インタフェースの実行用クラスの作成の3ステップを踏む必要があった。

// 1.インタフェースの作成
interface Car {
    String carType(String typeName); // 車の種類(抽象メソッド)
}

// 2.インタフェースの実装
public class CarImple implements Car {
    @Override
    public String carType(String typeName) { // 抽象メソッドのオーバーライド
        return "carType:" + typeName;
    }
}

// 3.インタフェースの実行
public class CarActu { 
    public static void main(String[] args) {
        Car sportsCar = new CarImple(); // 実装クラスのインスタンスを作成し、変数sportsCarに代入
        String car = sportsCar.carType("レクサス RC F"); // メソッドの戻り値を変数carに代入
        System.out.println(car); // 出力:carType:レクサス RC F
    }
}

しかし、匿名クラスを利用することで、①インタフェースの作成→②インタフェースの実装と実行を同時に行うクラスの作成の2ステップにまとめることができるようになった。

// 1.インタフェースの作成
interface Car {
    String carType(String typeName); // 車の種類(抽象メソッド)
}

// 2.インタフェースの実装と実行
public class CarActu { // 実行クラス
    public static void main(String[] args) {
        new Car() { // インタフェースの実装
            @Override
            public String carType(String typeName) { // 抽象メソッドのオーバーライド
                System.out.println(typeName);
                return "carType" + typeName;
            }
        }.carType("レクサス RC F"); // 実装クラスに対してメソッドの呼び出し
    }
}

匿名クラスの説明を踏まえラムダ式のおさらい

匿名クラスでも処理を簡潔に書くことができたが、ラムダ式を利用するとさらに簡潔に書くことができる。(コメントアウトしている部分は匿名クラスの場合の処理)

①引数の宣言(4行目のString name)②アロー演算子(->)③処理ブロック(アロー関数の後ろの中括弧の中の処理)の3つによって「実行したいコード」を表したのがラムダ式である。

public class CarActu { // 実行クラス
    public static void main(String[] args) {

        Car car = (String typeName) -> { // String name は抽象メソッドcarType(String typeName)のこと
            return typeName;
        };

        System.out.println(car.carType("レクサス RC F"));

//      new Car() { // 実装クラス
//          @Override
//          public String carType(String typeName) { // 抽象メソッドのオーバーライド
//              System.out.println(typeName);
//              return "carType" + typeName;
//          }
//      }.carType("レクサス RC F"); // 実装クラスに対してメソッドの呼び出し
    }
}

ラムダ式の書き方

1.基本型

・処理が複数行の場合は()をつける。

・引数には型(intやStringなど)を明示することができる

(int num1, int num2) -> {
    return num1 + num2;
}

2.型定義の省略

・引数の型は省略可能。

(num1, num2) -> {
    return num1 + num2;
}

3. 1行で書く処理

・処理を1行で書く場合、中カッコreturnが省略できる。

(num1, num2) -> num1 + num2;

4.引数が1つの処理

・引数が1つの場合、カッコを省略できる

num1 -> return num1 * 2;

5.引数なしの処理

・引数がない場合の処理は、カッコで表現する

() -> return "こんにちは";

ラムダ式の注意

・メソッド内で宣言したローカル変数と同じ変数名をラムダ式で使うことはできない。

・ラムダ式の外で宣言されたローカル変数にラムダ式の中からアクセスするには、定数(final)でなければならない。

// NG処理
public static void main(String[] args) {
    String str = "ABC";
    Function f = (str) {
        System.out.println(str);
    }
}

さいごに

最後までご覧いただき有難うございます!

個人的にラムダ式での記述は読めるようにはなったかなと思います。
自分で考えて記述するには練習が必要そうだなという感じです。。。

認識が異なる点があれば、ご指摘いただけると嬉しいです。

参考

Java SE11 Silver 第8章

https://www.bold.ne.jp/engineer-club/java-lambda-expression

1
0
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
1
0