たなかのJava日記

どんなことをやったか(学んだか)、どこで詰まったか(わからなかったか)、どこで工夫したかの記録です。

【Spring Boot】タスクを一覧表示するエンドポイントの作成

前回まで行ったことは、以下の2点になります。
・タスクの情報を保持するためのモデルの作成
・タスクを追加するモデルの作成


これでは、どんなタスクを登録したか確認することができません。
そこで今回は登録済みのタスクを一覧表示するエンドポイントも追加します。


    @GetMapping("/restlist")
    String listItems() {
        String result = taskItems.stream()
                .map(TaskItem::toString)
                .collect(Collectors.joining(", "));
        return  result;
    }


最初にアノテーションとして、 @GetMappingを指定しました。
どこで受け取るかをアノテーションの()内にvalue属性として記載します。
value属性はURLのどのパスに対するリクエストがどのメソッドで処理されるのかを指定するために使われます。
@GetMappingを指定した理由としては、
クライアントからのリクエストを処理するメソッドであることを示すためです。


@GetMapping("/restlist")


これで/restaddにリクエストが送信されたときの処理(タスクを一覧表示する処理)はこちらで行う(受け取る)と指定することができました。
また、@GetMappingを記載することでHTTP通信に関する部分の実装をSpringWebに任せることも行っています。


次に処理を行う箇所である、listitemsメソッドです。


taskItems.stream()

ここでは、コレクションからStreamを取得しています。
Streamとはコレクションの要素へのアクセスを許可されたもの、コレクションの別の形態と考えてください。
タスク情報はtaskItemsフィールドに格納されているので、その値をまとめて取得します。


.map(TaskItem::toString)


次に、Streamの中間処理を実施します。
Streamに流れる値を変更したり取捨選択するのが中間処理です。
mapメソッドは値を加工する場合に使用します。


今回はラムダ式をメソッド参照に変換し、値を加工しています。


ラムダ式の場合は以下のようになります。
. map(x -> TaskItem.toString(x))


ラムダ式で受け取った引数をメソッドにそのまま渡しているものはメソッド参照にできます。
メリットは変数名を考えなくていいことです。どういった名前が適切か考える必要がありません。


インスタンスメソッド呼び出しをメソッド参照に変換
.map(メソッドの属するクラス名::メソッド)
ここで、メソッドの属するクラス名を指定する必要があるので、どのクラスのメソッドを呼び出しているかの把握が必要になります。
わからない場合はIDEの補完に頼るなどした方が良いです。


解説ばかりでしたが、
ここではtaskItemsの各要素をtoStringメソッドで文字列に変換しています。
taskItemsの各要素はTaskItem型なのでメソッド参照の指定のクラス名はTaskItemになります。


.collect(Collectors.joining(", "));


最後に終端処理を行っています。
Streamでの処理から最終的な結果を取り出すのが終端処理です。
終端処理はStreamに直接用意されているものと、そうでないものがあります。
Collectorsクラスは直接用意されていないに該当します。
Collectorsクラスを使用した終端処理はcollectメソッドを介して使います。
今回はjoiningメソッドの引数に区切り文字を与え、与えた文字で区切られるようにし、結合を行いreturnで返しています。


今回作成した箇所を、以前作成したクラスに追加します。
そしてプロジェクトを再ビルドして実行してみます。
起動に成功したらブラウザのアドレスバーからいくつかのタスクを登録してみます。


http://localhost:8888/restadd?task=掃除&deadline=2021-05-07
http://localhost:8888/restadd?task=歯医者予約&deadline=2021-05-08
※8888の箇所は自分で指定したポート番号にする


タスクを登録したら、今度はアドレスバーに
http://localhost:8888/restlist
と打ち込んでみます。


このリクエストはHomeControllerのlistItemsメソッドに紐づいているはずなので、登録したオブジェクトが文字列として以下のように表示されれば成功です。


TaskItem[id=20b404f0, task=掃除, deadline=2021-05-07, done=false], TaskItem[id=75ec1824, task=歯医者, deadline=2021-05-08, done=false]