java8(JDK8)の新機能のラムダ式の利用方法をEclipseとJUnitで説明[その2:関数型インターフェースを例としたラムダ式]Java、Eclipse、JUnitに関連した技術情報のブログです。指定できる場所の概説と関数型インターフェースの初期化or代入の概要を記載させていただきました。本エントリーでは「関数型インターフェースの初期化」と題して「関数型インターフェースの初期化」の詳細な説明をさせていただきます。いっても、「メソッドの引数」に指定するラムダ式も考え方は同じです。Development)的に進めていきます。利用するIDEはEclipseでJUnit4です。betaを利用してJDK8対応のEclipse開発環境を作成する[Mac編]」をご覧ください。本エントリーの内容は、以下のようになります。Typeとラムダ式」は「その3」以降といたします。前回説明させていただいたラムダ式は、引数無し、戻り値も無しの物でしたので以下のような疑問がわいていたと思います。ラムダ式の中身を複数行にしたい時は?インターフェースの単一メソッドに引数がある時は?インターフェースの単一メソッドが戻り値を持つ時は?まずはこの疑問に対する説明をさせていただきますが、それに先駆けてユニットテストが実行できるようにします。ユニットテスト関連のファイルの作成プロジェクトプロジェクト名は何でもいいです。betaを利用してJDK8対応のEclipse開発環境を作成する[Mac編]」で作成した物をそのまま利用してもOKです。関数型インターフェース関数型インターフェースが1つ必要ですので、インターフェースをIFuncSampleとの名前で作成してください。作成後に以下の内容に変更してください。このインターフェースはメソッド定義がhogeだけなので関数型インターフェースです。ユーザー定義の関数型インターフェースには@FunctionalInterfaceアノテーションを記述するのが暗黙の了解になっています。諸事情で断念しました。hoge();}テストクラスJUnit4のテストケースを作成後、以下の内容に変更してください。buffer.toString());}}とりあえず、ユニットテストを実行するための環境ができましたので、実行してください。以下のような結果になると思います。@FunctionalInterfaceアノテーションラムダ式の説明に移る前に「@FunctionalInterface」アノテーションの効果の説明をしたいと思います。IFuncSampleに@FunctionalInterfaceを付与します。この時点では問題は発生しません。hoge();}次に、IFuncSampleインターフェースにhogehogeメソッドを追加します。hogehoge();}この時点でコンパイルエラーが発生します。エラーメッセージは以下のようになりました。関数型インターフェースにメソッドが追加されることをコンパイラが抑止します。戻り値や、引数の変更は抑止できませんが、あ!@FunctionalInterfaceだ、何も考えずに変更するとまずいぞ!と思わせる事ができるのでとても有効です。こちらもプロジェクトが分かれていても、プロジェクトを直接参照している場合は。コンパイラがエラーを出力して抑止されますが、jarに固めて、それを参照している場合だとコンパイラは気付けません。ラムダ式の中身を複数行にしたい時は?if文と同じ考え方です。if文も1行だと{}で閉じないでいいですよね、逆に複数行になると{}で閉じないといけないです。この考え方プラス、ラムダ式はそれ自体が式なので{};と最後にセミコロンが必要となります。IFuncSampleTestのtestHogeの中身を書き換えて、ラムダ式の中身を複数行にしてみましょう!testHogeメソッドを以下の様に変更しました。ポイントは5行目の}の後のセミコロンです。ラムダ式がここで終了するのでifの{}とは異なりセミコロンが必要です。buffer.toString());}テストも実行してみましょう。予想通り失敗しました。上記コードの4行目の処理もラムダ式として認識されていますね。assertEqualsの期待値も変更してみます。buffer.toString());}テストの実行結果は以下の様になりました。インターフェースの単一メソッドに引数がある時は?インターフェースの単一メソッドに引数がある時は、当然ですがラムダ式でも引数を指定する必要があります。それだけですが、引数の指定時にのルールがいくつかあります。関数型インターフェースのメソッドに引数を追加IFuncSampleを以下の様に変更しました。age);}見たまんまですが、String型のnameとint型のageの引数を追加しました。当然ですが、IFuncSampleTestのコンパイルが通らなくなりました。ラムダ式における引数指定インターフェースのIFuncSampleにhogeメソッドの定義に変更が加わったのでラムダ式も対応を行います。ラムダ式でもインターフェースの任意のメソッド実装時と同様の指定方法で引数を指定できます。three!");};ラムダ式では、メソッド実装時のように引数の型を必ず指定しなくてもOKです。インターフェースの単一メソッドと同じメソッド構文(シグネチャ)をラムダ式も取らざるおえず、この例の場合は、第一引数はString、第二に日数はintと見なされます。このメソッド構文と異なるラムダ式を敢えて記述した場合は構文エラーと見なされます。引数の型を指定しても問題ないです。指定しているのが前述の例です。three!");};なお、仮引数名(この例だとname,age)に’_’単独の文字列は指定できません。今後の拡張用に確保されているようです。実際にhogeを呼び出している部分も修正したtestHogeメソッドは以下の様になります。buffer.toString());}コンパイルエラーが無くなったのでテストを実行してみましたが、成功しました。画像はスペースの無駄なので省略いたします。name(age)”になるように処理を変えます。buffer.toString());}テストを実行するともちろん失敗します。buffer.toString());}これでテストが成功しました。インターフェースの単一メソッドが戻り値を持つ時は?これも普通にインターフェースを実装する時と同じなのですが、1点だけ異なる点があります。IFuncSampleのhogeメソッドの戻り値をStringに変更してみます。予想通りコンパイルエラーが発生します。一応、TDDって言葉出してますので、hogeの呼び出しの所の対応を行います。単純にbufferに格納された文字列がリターンされることを想定した変更です。30));}ラムダ式の最後にbuffer.toString();をリターンする処理を追加します。30));}これでテスト通るはずです。テスト実行は成功しました。久しぶりの画面イメージ最後に、普通にインターフェースを実装する時異なる点の説明です。「ラムダ式の中身を複数行にしたい時は?」で説明させていただきましたが単一行の場合は{}は省略可能ですし、記載してもよいです。ラムダ式が単一行で{}でくくられてない時にみreturnが省略可能です。その行の値がリターンされるとみなされます。その行の値は当然ですが、インターフェースのメソッドの戻り値の型と同じである必要があります。現状のテストメソッドtestHogeの中で記載しているラムダ式をreturnが省略できるように書き換えてみると以下のようになります。").append(name).append("(").append(age).append(")").toString();確かに単一行ですね・・・、むりくりですがwappendの繰り返し&最後にtoString()で行の値がStringになるようにしています。繰り返しになりますが、最後のtoString()が無いとコンパイルエラーとなります。8)の新機能のラムダ式の利用方法[その2:関数型インターフェースを例としたラムダ式]」は以上です。8)の新機能のラムダ式の利用方法[その3:java8が用意している関数型インターフェース]」に続く。64bitにJDK8(Java8)をインストールする説明を記載させ記事を読むEclipseの使い方(Eclipse4.4のブックマーク機能とタスク機能)今回は、Eclipseのブックマーク機能とタスク機能の説明をさせていただきます。Eclipse[5:クラスに関する基礎知識(メソッドをJUnitを使って説明)]クラスに関する基礎知識シリーズも、いよいよメソッドを残すのみとなりました。Eclipse[3:クラスに関する基礎知識(クラスとインスタンスとパッケージ)]Javaといえば、「オブジェクト指向」とのイメージがとっても強いですよね。コメントをキャンセルメールアドレスが公開されることはありません。(4.7.1)を利用してJUnit5の公式ガイドの内容を実践してみる。JUnit5が本格的に利用できる環境が整ってきました。RSSWordPress.orgjava8(JDK8)の新機能のラムダ式の利用方法をEclipseとJUnitで説明[その2:関数型インターフェースを例としたラムダ式]Java、Eclipse、JUnitに関連した技術情報のブログです。