この記事の概要
ラムダ式、関数型インターフェース、メソッドチェーンを使用した実装例を示す
先に後続に示すソースの対応部分を抜粋すると以下になります。
【ItemTestクラス】メインメソッド側
■メソッドチェーン(.でメソッドを繋いでいる部分)
Item.save(item -> {
item.id(“d34”)
.name(“S1000-234”)
.price(10000);
※これができるのは、
メソッドの戻り値を自クラスの参照で返却しているためです
【Itemクラス】処理の実態側
■ラムダ式(->の記述の部分)
Item.save(item -> {
item.id(“d34”)
.name(“S1000-234”)
.price(10000);
■関数型インターフェース
public static void save(Consumer
【ItemTestクラス】メインメソッド側
【仕様】
商品クラスの各フィールドに、値設定し、その内容を表示する
【考察】
上記の仕様だと以前だと以下の2つの実装方法がありました。
■以前の方法1
引数付きのコンストラクターを作成し、それぞれのフィールドに値を渡す
引数の数が多くなると、とても見にくく実装ミスも多くなる
■以前の方法2
setterを準備し、セット
実装量が多くなる
【説明】
■最新の方法
ラムダ式を使用するため関数型のインターフェース(パッケージjava.util.function)を実装し、メソッドチェーンで記述できるように値設定のメソッドの戻り値はクラスの参照として実装
【動作】
以下のような動作結果になります。
動作の実態はItemクラス側になるので、そちらで説明します。
【Itemクラス】処理の実態側
上記のように1~4に分けているので、それぞれ説明します。
■1について
商品のフィールドを定義
■2について
コメントに記載している通りですが、
値をセットして、本クラスの参照をリターンしている。この実装でメソッドチェーンが実現
できている。
■3について
関数型インタフェースを実装したstaticメソッドにacceptで当クラスの空の参照を渡している
ため、ラムダ式にItem型の空のインスタンスが渡されている状態
Consumer(関数型のインターフェースについては以下にAPI仕様のリンクを記載する)
=======
System.out.println(“save1 ” + item);
System.out.println(“save2 ” + item.toString());
=======
上記の記述については、結果の確認用の記述です。
どちらも同じ出力になっています。toStringメソッドを明示しなくてもよいということ。
■4について
コメントに記載している通り
結果の確認とかデバック的な使い方で、よくやります
4の記述はジェネレータで自動記述できます。
右クリック > ソース > toString生成