【问题标题】:Java8 Lambda expression to iterate over enum values and initialize final memberJava8 Lambda 表达式迭代枚举值并初始化最终成员
【发布时间】:2015-03-25 09:35:28
【问题描述】:

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

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

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

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 可能尚未初始化

【问题讨论】:

  • 只是想知道:在您的枚举中为您执行此操作的成员函数是否有意义?如果拥有此枚举的唯一原因是收集潜在枚举值列表并构建其字符串表示 - 为什么要外部化第二部分?
  • 好点。我想我把责任归咎于旧的遗留代码和缺少重构事物的意愿:)

标签: java lambda enums java-8


【解决方案1】:

你可以的

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

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

【讨论】:

  • 完美!我只想补充一点,toList() 方法来自 Collectors 类。
  • 一篇不错的文章,展示了在 Java 中迭代枚举值的方法:baeldung.com/java-enum-iteration
猜你喜欢
  • 1970-01-01
  • 2021-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多