Java8 Lambda表达式遍历枚举值并初始化final成员

13

我有一个静态枚举,类似这样:

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

有两个问题:

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

只是想知道:在枚举中有一个成员函数为您执行此操作,这是否有意义?如果仅出于将潜在的枚举值列表收集起来并构建其字符串表示的原因而使用此枚举 - 为什么要将第二个部分外部化? - GhostCat
好观点。我想我把责任归咎于旧的遗留代码和缺乏重构事物的意愿 :) - s.meissner
1个回答

25

你可以做

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

这将从一个值的数组创建一个流,对每个值应用.name()方法,最后将所有结果收集到一个列表中。


2
太好了!我只想补充一下,toList() 方法来自 Collectors 类。 - s.meissner
1
一篇很好的文章,展示了在Java中迭代枚举值的方法:http://www.baeldung.com/java-enum-iteration - OutOfMind

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接