見出し画像

JavaのStreamを落書き感覚で...

Canvaというツールで見出し画像を作成できる。使ってみたけれど、使いやすい。こんなものがサクッと手軽に作れるなんて、便利な時代になったと思う。本当にタダで使っていいんだよね?と確認したくなるほど充実している。昔はillustratorで地道に…。いや、昔の話はやめておこう。つまらない話になってしまうから。


ちょっと前に社内でLTがあった。その中で「もっと自由に、楽しくコードを書きませんか?」という話があった。思えば、昔はプログラムを書くことが楽しかった。(結局昔の話をしているな)自由に発想したし、プログラムが何かの役に立つか、知識が増えているか、なんて気にもしなかった。レゴブロックで遊ぶのと同じような感覚でパソコンを開いていた。けれども、最近は違った。もっとコードを書くのを楽しもうと思った。勉強とは別に。

コードは前回書いた記事の続きになる。

Collections.groupingByに惹かれて使ってみたのだけれど、2回グルーピングすることも(3回、4回も?)できるらしい。Qiitaの記事で使っているのを見かけたのだ。もちろんLGTMして、保存した。こういったコードサンプルがあるのは新しい発見があって楽しいものだと最近思うようになった。Javadocを読んで動作イメージつかみにくいものがほとんどだから。

参考にして前回の記事のコードベースを元に何んとなーく書いてみた。グルーピングした後にそれぞれのグループの値を何らかの値に変換する、という感じらしい。なるほど。これは使いやすいんじゃないだろうか?

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.function.Function;
import java.util.stream.Collectors;
import java.util.stream.Stream;

class Scratch {
    public static void main(String[] args) {
        Function<Checkin, LocalDate> checkinMonth = (Checkin checkin) -> checkin.dateTime().toLocalDate().withDayOfMonth(1);

        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(checkinMonth,
                        Collectors.averagingDouble(checkin -> checkin.condition().level())))
                .forEach((LocalDate date, Double avg) -> System.out.printf("%s avg %s%n", date, avg));
    }
}

この記事が気に入ったらサポートをしてみませんか?