Javaの研修について言いたい
完全に自社の話になりますが、他の企業様はどうなんだろうという興味本位なアレ。
2014年3月にJava8が出てから10年以上も経ってるわけですが、Javaの研修でラムダ式って教えないの?
※今年の新人に聞いたら【調べて使ってもいいよ】って感じだったようで、
「外部研修なのにマジで時代おくれてんなぁ、平成か?」ってなったわ。
Javaの研修と言えば、オブジェクト指向から始まって、
class・methods・型(プリミティブ・オブジェクト)などがあり、
if/switchの分岐、for/while/forEachのループ文などの基本構文を覚えた後とかに、
ラムダ式ってやらんのか?(ウチだけ?
そもそも流石に10年も経ってるんだし、
基本構文に含めてもいいんじゃね?位の気持ちでいたんだけど。。。
じゃあラムダで書くと何がいいんだよ?
例えば、一覧画面でチェックを付けた行だけ一括更新的な処理を想定して、、、
- 画面からのパタメータとしてString配列のidを取得
- 更新先のIDは数値型なのでString→Integer変換が必要
- 更新対象のデータを取得して特定のカラムを変更
みたいな処理が合ったとすると。。。
public void delete(String[] hogeIds) {
if (hogeIds != null && hogeIds.length > 0) {
List<HogeTable> targetList = new ArrayList<>();
for(String id : hogeIds) {
if(NumberUtils.isDigits(id)) {
HogeTable hoge = hogeTableRep.getOne(Integer.parseInt(id)); // JpaRepositoryを使ってる想定
if(hoge != null) {
hoge.setHogeColumn("hogehoge");
targetList.add(hoge);
}
}
}
hogeTableRep.saveAll(targetList); // JpaRepositoryを使ってる想定
}
}
ネストが深くてクソみたいな作りだな。。。
public void delete(String[] hogeIds) {
if (hogeIds != null && hogeIds.length > 0) {
hogeTableRep.saveAll(
Arrays.stream(hogeIds)
.filter(id->NumberUtils.isDigits(id))
.map(id -> mstUserRep.getOne(Integer.parseInt(id)))
.filter(hoge -> hoge != null)
.map(hoge -> {
hoge.setHogeColumn("hogehoge");
return hoge;
})
.collect(Collectors.toList())
);
}
}
いや、書き手のさじ加減じゃね?っていうのはわかるけど、
やってることが結構明確になったんじゃね?という見解なんだが、
どっちのほうが好まれるのかしら?
ListとかMapとかのコレクション系の操作の時にめっちゃ役に立つよね?
要するに。。。
プログラムって【仕様通りにさえ動いてしまえば】別にどんだけネストしようが無駄な分岐が有る書き方だろうと別に正解なわけで、
「一々そんなに拘るなよ、うるせぇなぁ。。。」ってなると思いますが、
どうせ書くんなら【キレイ・サッパリ・エレガント】な感じで書きたいじゃん?
ってなわけで、自分の書き方の幅を広げるためにも是非ともラムダ式覚えて帰っていってほしいです。