午後1時過ぎIDEを立ち上げて...
まず初めに断っておきたいのは、この記事は(そして、これから投稿されるであろう記事の数々は)私がソースコードを書いたり、プログラムを動かしてみたりしたもので、感想とか思ったこととかをつらつらとその場の直感で書いていくものである。なので、新しい知識を追い求めるエンジニアにとっては特に有用な情報を含んでいるものではない。きちんと検証もしないだろうし、整理もしない予定である。もし、ちゃんとした記事を読みたいのであればひしだまさんのサイトやQiita、Zennなどの記事を読んだほうがいいと思う。
土日の疲労も回復できず、肩の緊張がほどけないままリモートワークを始めた。結局、疲労が限界にきて午後から休みを取ることになった。頭痛薬を飲んだけれど、病院からもらったこの薬そんなに効果がない。
少し回復したところで少しJavaを書きたくなり(なんでもいいのでコードを書きたくなる時がよくある)IntelliJを立ち上げた。
特に理由がないわけではないが、自身の状態を表現するプログラムを書いてみた。最近体の調子が悪いのでそれをネタに。(そんなことをネタにしている時間があったら、ちゃんと休んだほうがいいのでは?と記事を書きながら思った)
/**
* コンディションとは、心身の状態をレベル(5段階評価で表したもの)です。
*
* @param level 心身の状態を表す評価値。1~5の間で表現し、数値が大きいほど心身の状態が良いことを示す。
*/
record Condition(int level) {
/**
* コンディション作成時に {@link Condition#level} が適切な範囲であることを検査します。
*/
public Condition {
if (level <= 0 || level > 5) throw new IllegalArgumentException();
}
}
import java.time.LocalDateTime;
/**
* チェックインとは、特定日時とコンディション、メモ等をまとめたものです。
*
* @param dateTime チェックイン日時
* @param condition コンディション
* @param memo メモ
* @see Condition
*/
record Checkin(LocalDateTime dateTime, Condition condition, String memo) {
/**
* 現在日時でチェックインを新しく作成します。
*
* @param condition コンディション
* @param memo メモ
* @return 新しいチェックイン
*/
static Checkin now(Condition condition, String memo) {
return new Checkin(LocalDateTime.now(), condition, memo);
}
}
JDKは17を使っているのでrecord classを定義できる。Kotlinでいうところのdata class。やっとJavaにもイミュータブルなクラスを宣言しやすい構文が入ったと。今まででもfinalで宣言すれば同じことができるのだが、recordと最初に宣言することによってはるかに簡単になったと思う。これから仕事の場でもrecordを書く機会が増えることを願う。(頼む)
class Scratch {
public static void main(String[] args) {
Stream.of(
new Checkin(LocalDateTime.of(2022, 4, 3, 19, 30), new Condition(4), "memo"),
new Checkin(LocalDateTime.of(2022, 4, 5, 7, 47), new Condition(4), "memo"),
new Checkin(LocalDateTime.of(2022, 5, 20, 7, 12), new Condition(3), "memo")
)
.collect(Collectors.groupingByConcurrent((Checkin checkin) -> checkin.dateTime().toLocalDate().withDayOfMonth(1)))
.forEach((LocalDate date, List<Checkin> checkins) -> System.out.printf("%s checkins is %s%n", date, checkins));
}
}
IntelliJのスクラッチファイルを使ってStream APIを使ったコードを書いてみた。Stream APIって使わないと徐々に忘れていく類のものなんだよね…。だから、こうやって思い出しながらも手を動かしてみる。
Collectors.groupingByは意外と使いどころがある関数と思った。グループ化ってこんな簡単に書けたんだ。知らなかったな。
気が付いたらO'ReillyのJavaによる関数型プログラミングをeBookでポチっていたのでボチボチと読もう。この本2014年に書かれたもので、Stream APIも2014年からあると思うと、もうそんなに時間たったのかと少し驚いてしまった。年を取ると時間の流れが速く感じるのは嘘ではなかったと最近実感している。