使用流返回枚举中包含的给定字符串列表的枚举数组



我有一个字符串枚举,如下所示:

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并为其找到相应的枚举。

例如:列表包含字符串"某个值"one_answers"某个第三个值",然后我想使用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()));

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

SomeEnum中,您可以从字符串名称到枚举构建一个Map<String, SomeEnum>,并在类加载时对其进行初始化。然后在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());

构建从字符串到相应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());

(您可能想也可能不想处理在映射中找不到字符串的情况:例如,您可以抛出异常,或者删除这样的元素(。

最新更新