【问题标题】:Return enum array for a list of given strings contained in the enum using streams使用流返回枚举数组以获取枚举中包含的给定字符串列表
【发布时间】:2020-04-09 13:16:30
【问题描述】:

我有一个这样的字符串枚举:

public enum SomeEnum {

  STRING1("some value"),
  STRING2("some other value");
  STRING3("some third value");

  ...more strings...

  private String name;

  SomeEnum(String name) {
    this.name = name;
  }

  @Override
  public String toString() {
    return name;
  }

我有一个包含一些字符串的列表 someStringList。

我想遍历 someStringList 并为它找到相应的枚举。

例如:列表包含字符串“某个值”和“某个第三个值”,那么我想使用 Java Stream-API 向我返回一个包含 SomeEnum.STRING1 和 SomeEnum.STRING3 的列表

不知怎的,我无法让它工作。我试过这样的事情:

    List<SomeEnum> enumList = Stream.of(someStringList).forEach( s -> Stream.of(SomeEnum.values()).filter(w -> w.toString().equalsIgnoreCase(s)).collect(Collectors.toList()));

但这不会编译,因为它不返回任何东西。有什么想法吗?

【问题讨论】:

  • 这能回答你的问题吗? Finding enum value with Java 8 Stream API
  • 很遗憾没有,因为在所有类似的问题中我发现它是一个字符串而不是字符串列表
  • 在接受的答案中有 find 方法后很容易适应。只需流式传输您的字符串列表和map,结果为find
  • 有一个SomeEnum值流,通过检查someStringList是否包含被过滤的枚举值的name来过滤它,并将过滤后的枚举值收集到一个列表中

标签: java arraylist enums java-stream


【解决方案1】:

在您的SomeEnum 中,您可以从字符串名称到枚举构建Map&lt;String, SomeEnum&gt;,并在类加载时对其进行初始化。然后在您的SomeEnum 中声明一个名为fromString 的公共静态方法,该方法返回给定字符串的枚举常量(如果存在)。

private static final Map<String, SomeEnum> stringToEnum = Arrays.stream(values())
    .collect(Collectors.toMap(SomeEnum::toString, e -> e));

public static SomeEnum fromString(String name) {
    return stringToEnum.get(name);
}

然后在您的客户端代码中使用它。这是它的外观。

List<SomeEnum> enumList = someStringList.stream()
    .map(SomeEnum::fromString)
    .collect(Collectors.toList());

【讨论】:

    【解决方案2】:

    构建从字符串到对应SomeEnum值的映射:

    Map<String, SomeEnum> map = 
        Arrays.stream(SomeEnum.values()).collect(toMap(SomeEnum::toString, s -> s));
    

    (可以一次性保存)

    那你可以在这个里面查:

    List<SomeEnum> enumList = someStringList.stream().map(map::get).collect(toList());
    

    (您可能希望也可能不希望处理在地图中找不到字符串的情况:例如,您可以抛出异常或删除此类元素)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多