バックエンド

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

enum-loop
野田竣介

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

Enumをループさせたい!

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

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

Enumって何?

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

列挙型と呼ばれますね。

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

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

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

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

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

Enumの定義

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

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

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

// Size.java
/**
 * サイズ
 */
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の使い方についてはこちら!

あわせて読みたい
【Java】String.formatを使ってみよう!【基本から0埋め・カンマ区切り・進数変換まで!】
【Java】String.formatを使ってみよう!【基本から0埋め・カンマ区切り・進数変換まで!】

ラムダを使ったループ

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文を使った場合より少し複雑になってしまいますね。

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

記事URLをコピーしました