2017-08-04 26 views
2

これは、列挙型の値を文字列配列に変換することについてです。私が列挙持っている:列挙型の値をJavaの文字列配列に変換する最も便利な方法

enum Weather { 
    RAINY, SUNNY, STORMY 
} 

をそして私は、最小限の労力とJava 8+となしのループで文字列配列にこれを変換したいです。これは私が思いついた最高です:

Arrays.stream(Weather.values()).map(Enum::toString).toArray(String[]::new) 

同じことを行うための他の同様の、またはより便利な方法?

+0

変更できます列挙型ですか?列挙型の内部に配列を構築し、それを取得するゲッターを提供するだけです。 –

+0

@ christopher-schneider:できます。しかし、それはポイントではありません。私の指摘は最小限の変換を作成することであり、どこにあるかは関係ありません。 –

答えて

8

オリジナルポストが

はい、それは良いのJava 8の方法ですが、...

toStringを上書きすることができますので、あなたはより良い(enum定数の名前を返しますWeather::nameでいいよ正確列挙宣言で宣言されたように)変更することはできません。

Stream.of(Weather.values()).map(Weather::name).toArray(String[]::new); 

ジェネリック

のビット

私は一般的な方法で任意の列挙に対処するためのヘルパークラスを書いた:ここ

class EnumUtils { 

    public static <T extends Enum<T>> String[] getStringValues(Class<T> enumClass) { 
     return getStringValuesWithStringExtractor(enumClass, Enum::name); 
    } 

    public static <T extends Enum<T>> String[] getStringValuesWithStringExtractor(
      Class<T> enumClass, 
      Function<? super T, String> extractor 
    ) { 
     return of(enumClass.getEnumConstants()).map(extractor).toArray(String[]::new); 
    } 

} 

はデモンストレーションです:

enum Weather { 
    RAINY, SUNNY, STORMY; 

    @Override 
    public String toString() { 
     return String.valueOf(hashCode()); 
    } 

    public static void main(String[] args) { 
     System.out.println(Arrays.toString(EnumUtils.getStringValues(Weather.class))); 
     System.out.println(Arrays.toString(EnumUtils.getStringValuesWithStringExtractor(Weather.class, Weather::toString))); 
    } 

} 

そして出力:

[RAINY, SUNNY, STORMY] 
[359023572, 305808283, 2111991224] 
+0

Stream.ofアイデアをありがとう。 using :: nameや:: toStringに関しては、少し議論の余地があります。特定の状況下では、文字列表現を変更することができます。 –

+0

@ gil.fernandes、はい、良い点 - これらの値を動的に表現したい場合は、 'toString'のような' String'抽出関数を使用してください。そうでなければ、最後の 'name'を使用してください。 – Andrew

関連する問題