Подтвердить что ты не робот

Java8 Lambda выражение для итерации по значениям перечисления и инициализации конечного элемента

У меня есть статическое перечисление вроде этого:

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

Мне нужны все значения как String. Поэтому у меня есть такой способ:

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()));

Два вопроса:

  • Можно ли избежать оболочки Arrays.asList?
  • Как я могу обработать ошибку компилятора: Пустое конечное поле standardAttributesList, возможно, не было инициализировано?
4b9b3361

Ответ 1

Вы можете сделать

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

Это создаст поток из массива значений, применит метод .name() к каждому из них и, наконец, соберет все результаты в список.