バックエンド

【Java】Enumをループさせてみよう!

enum-loop

こんばんは!光です。

大手グローバル企業でWebエンジニアをやっています。

Webエンジニアを目指してプログラミングを勉強している初心者の方向けに情報を発信しています。

経歴や実績はこちら

システム開発のお仕事の依頼もお待ちしております。

お問い合わせページTwitterのDMからお気軽にお問い合わせください!

今回はこのような質問をいただきました。

Enumをループさせたい!

Enumって慣れるまで少し難しいですよね。

そこで今回はこちらの質問について解説していきます!

Enumって何?

Enumは定数をまとめたclassです。

列挙型と呼ばれますね。

読み方は「いーなむ」、「いなむ」、「えなむ」などなど…

いくつかの定数をまとめて保持したい場合に使います。

例えば、服のサイズを扱うときはS, M, L, XLなんかをEnumで定義するのが良いですね。

Enumをループさせてみよう!

では実際にEnumを定義してループをまわしてみましょう!

Enumの定義

まずは今回利用するEnumを定義します。

先ほどの例のようにサイズのEnumを作ってみました。

このSize.javaで定義したEnumをループさせてみたいと思います。

/**
 * サイズ
 */
public enum Size {
    S(145, 155),
    M(150, 160),
    L(155, 165),
    XL(155, 165);

    /**
     * 最小身長
     */
    private final int min;

    /**
     * 最大身長
     */
    private final int max;

    Size(int min, int max) {
        this.min = min;
        this.max = max;
    }

    public int getMin() {
        return min;
    }

    public int getMax() {
        return max;
    }
}

拡張for文を使ったループ

values()ですべての定数を取得してその値をループさせます。

シンプルでわかりやすい!

for (Size size : Size.values()) {
    System.out.println(
            String.format(
                    "身長が%scm〜%scmの人には%sがオススメ",
                    size.getMin(), size.getMax(), size.toString()
            )
    );
}
身長が145cm〜155cmの人にはSがオススメ
身長が150cm〜160cmの人にはMがオススメ
身長が155cm〜165cmの人にはLがオススメ
身長が155cm〜165cmの人にはXLがオススメ

文字列をすべて「+」でつなげたら読みにくかったのでString.format使ってみました。
String.formatの使い方についてはこちら!

ラムダを使ったループ

Java8以降であればラムダを使いたいですよね。

個人的にはこっちのほうが好き!

Arrays.stream()で配列からStream型に変換した後に、Collectors.toList()でList型に変換してforEachでループさせます。

Arrays.stream(Size.values()).collect(Collectors.toList()).forEach(size -> {
    System.out.println(
            String.format(
                    "身長が%scm〜%scmの人には%sがオススメ",
                    size.getMin(), size.getMax(), size.toString()
            )
    );
});
身長が145cm〜155cmの人にはSがオススメ
身長が150cm〜160cmの人にはMがオススメ
身長が155cm〜165cmの人にはLがオススメ
身長が155cm〜165cmの人にはXLがオススメ

まとめ

拡張for文を使う場合はこんな感じ。

for (Size size : Size.values()) {
    System.out.println(
            String.format(
                    "身長が%scm〜%scmの人には%sがオススメ",
                    size.getMin(), size.getMax(), size.toString()
            )
    );
}

ラムダを使う場合はこんな感じ。

Arrays.stream(Size.values()).collect(Collectors.toList()).forEach(size -> {
    System.out.println(
            String.format(
                    "身長が%scm〜%scmの人には%sがオススメ",
                    size.getMin(), size.getMax(), size.toString()
            )
    );
});

どちらもやっていることは同じです!

あとがき

拡張for文、ラムダどちらを使ってもスマートですね!

個人的にはあまりfor文を書きたくないのでラムダのほうが好きです。

ただ、拡張for文を使った場合より少し複雑になってしまいますね。

自分が使いやすいと思うほうを使ってみましょう!