web-dev-qa-db-ja.com

列挙値を反復処理して最終メンバーを初期化するJava8 Lambda式

私はこのような静的な列挙型を持っています:

private static enum standardAttributes {
    id, gender, firstname, lastname, mail, mobile
}

文字列としてすべての値が必要です。したがって、私はこのような方法を持っています:

public static List<String> getStandardRecipientsAttributes() {
    List<String> standardAttributesList = new ArrayList<String>();
    for (standardAttributes s : standardAttributes.values())
        standardAttributesList.add(s.toString());

    return standardAttributesList;
}

このメソッドが呼び出されるたびに同じリストを作成する必要はありません。だから私は静的メンバーを作成しました:

static final List<String> standardAttributesList;
static {
    standardAttributesList = getStandardRecipientsAttributes();
}

これで問題ありませんが、メソッドを置き換えるための派手なLambda式があるのでしょうか。このようなもの:

Arrays.asList(standardAttributes.values()).forEach((attribute) -> standardAttributesList.add(attribute.toString()));

2つの質問:

  1. Arrays.asListラッパーを回避できますか?
  2. コンパイラエラーを処理する方法:空白の最終フィールドstandardAttributesListが初期化されていない可能性があります
13
s.meissner

できるよ

_static final List<String> standardAttributesList = 
                                           Stream.of(values())
                                                 .map(Enum::name)
                                                 .collect(Collectors.toList());
_

これにより、値の配列からストリームが作成され、.name()メソッドがそれぞれに適用され、最後にすべての結果がリストに収集されます。

24
Peter Lawrey