【はじめてのJava】ラムダ式【匿名クラスとラムダ式編】
はじめてのJava
このシリーズでは、初めてJavaやプログラミングを勉強する方向けに、Javaによるプログラミングの基礎を説明していきます。
目標レベルは、Javaの資格試験の一つである「Oracle Certified Java Programmer, Silver」(通称Java Silver)に合格できる程度の知識の習得です。
はじめてJavaやプログラムに触れる方にもできるだけわかりやすい解説を心がけていきます。
匿名クラス
目次
ラムダ式
ラムダ式は、Java8から追加された、プログラムの記述方法でした。
ラムダ式は、関数型インタフェースやStreamAPIと組み合わせて利用することができる記述です。
ラムダ式の大きな特徴として「->(アロー演算子)」を利用して、記述を行います。
関数型インタフェースをラムダ式で実装する場合、以下のように記述します。
(引数の型名 抽象メソッドの引数名) -> { 処理内容; return 戻り値; }
関数型インタフェースとStreamAPIを利用したプログラムを紹介して、記述がどのように変化するのか見ていきましょう。
関数型インタフェースでの利用
関数型インタフェースの実装を行う際のプログラムをそれぞれ3つのパターンで記述します。
同じプログラムの処理を①通常の実装クラスを利用したサンプル、②匿名クラスを利用したサンプル、③ラムダ式を利用したサンプルでそれぞれ記述してみますので、プログラムの行数や記述を比べてみましょう。
(例)Sampleインタフェースを匿名クラスで実装し、抽象メソッドをオーバーライドして利用する
①通常の実装クラスを利用したサンプル
interface Sample{ //Sampleインタフェースの定義 public void test(); //抽象メソッド「test()」を定義 } class ImpSample implements Sample{ //Sampleインタフェースの実装クラスを定義 @Override //インタフェースに定義された抽象メソッドのオーバーライド public void test(){ System.out.println("testメソッドのオーバーライド"); } } class JissouSample{ public static void main(String[] args){ ImpSample imSam = new ImpSample(); // 実装クラスのインスタンス化 imSam.test(); // imSamオブジェクトのtest()メソッドを呼び出す。 } }
②匿名クラスを利用したサンプル
interface Sample{ //Sampleインタフェースの定義 public void test(); //抽象メソッド「test()」を定義 } class TokumeiSample{ public static void main(String[] args){ Sample sam = new Sample() { //Sample型の変数「sam」を定義し、匿名クラスで実装する @Override //インタフェースに定義された抽象メソッドのオーバーライド public void test(){ System.out.println("testメソッドのオーバーライド"); } }; //定義されたローカル変数の「sam」はスコープ内で呼び出しが可能になります。 sam.test(); //samオブジェクトのtest()メソッドを呼び出す。 } }
③ラムダ式を利用したサンプル
interface Sample{ //Sampleインタフェースの定義 public void test(); //抽象メソッド「test()」を定義 } class LambdaSample{ public static void main(String[] args){ Sample sam = () -> { //ラムダ式の記述でSampleインタフェースの実装、オーバーライドを行っています。 System.out.println("testメソッドのオーバーライド"); }; //定義されたローカル変数の「sam」はスコープ内で呼び出しが可能になります。 sam.test(); //samオブジェクトのtest()メソッドを呼び出す。 } }
匿名クラスを利用したサンプルとラムダ式を利用したサンプルでコード量などにそこまで差はないように感じますが、ラムダ式を利用する場合、記述の省略を行うことができます。
記述の省略を行うことでさらにコード量を短縮することが可能になります。
StreamAPIでの利用
「StreamAPI」は、ListやMapなどのコレクションを操作する場合に非常に便利なAPIです。
拡張for文などで行っていた処理をStreamAPIで行うことで、短い記述で操作を行うことができます。
(例)Integer型のArrayListを定義し、その中の奇数の値だけを画面に表示する
class StreamSample{ public static void main(String[] args){ ArrayList<Integer> list = new ArrayList<>(); list.add(10); list.add(11); list.add(12); list.add(13); list.add(14); list.add(15); //拡張for文を利用して操作を行う for(Integer i : list){ if(i % 2 == 1){ System.out.println(i); } } //StreamAPIを利用して操作を行う list.stream().filter(i -> i % 2==1).forEach(i -> System.out.println(i)); } }
匿名クラスとラムダ式編・次回の内容
今回はラムダ式の構文について紹介しました。
次回は、ラムダ式の省略記法について解説していきます。
初めてのJavaシリーズの目次はこちら
匿名クラスとラムダ式編の記事一覧はこちら