Java8 Lambda表达式迭代枚举值并初始化最终成员

时间:2015-03-25 09:35:29

标签: java lambda enums java-8

我有一个像这样的静态枚举:

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;
}

每次调用此方法时都无需创建相同的List。所以我创建了一个静态成员:

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

这一切都很好,但我想知道是否有一个奇特的Lambda表达式来替换该方法。像这样:

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

两个问题:

  1. 我可以避免使用Arrays.asList包装吗?
  2. 如何处理编译器错误:空白的最终字段standardAttributesList可能尚未初始化

1 个答案:

答案 0 :(得分:24)

你可以做到

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

这将从值数组创建一个Stream,将.name()方法应用于每个值,最后将所有结果收集到List中。