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

标签 java lambda enums java-8

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

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. 我该如何处理编译器错误:空白的最终字段 standardAttributesList 可能尚未初始化

最佳答案

你可以做到

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

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

关于Java8 Lambda 表达式迭代枚举值并初始化最终成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29251967/

相关文章:

java - 将 Web 界面添加到现有项目

java - 每 20 分钟分析一次程序行为

java - lambda 表达式和实例化方法引用之间的不同行为

javascript - 关于在 AWS NodeJS 上使用 TypeScript。 (获取 TS 而不是 JS 的堆栈跟踪)

java - 通过添加 Enum 静态 Holder 进行优化

java - 为什么在HashMap中计算hashcode的索引

java - 读取文件以打印到屏幕

c++ - 为什么 std::vector 的相同成员的地址在 std::sort 的比较函数中不同?

swift - 枚举值和谓词

java - 如何在 Java 中使用 ENUM 生成随机数