Java 使用流返回枚举中包含的给定字符串列表的枚举数组
我有一个字符串枚举,如下所示:Java 使用流返回枚举中包含的给定字符串列表的枚举数组,java,arraylist,enums,java-stream,Java,Arraylist,Enums,Java Stream,我有一个字符串枚举,如下所示: 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 St
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并找到它对应的枚举
例如:该列表包含字符串“some value”和“some third value”,然后我想使用Java流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()));
List enumList=Stream.of(someStringList).forEach->Stream.of(SomeEnum.values()).filter(w->w.toString().equalsIgnoreCase().collect(Collectors.toList());
但它不会编译,因为它不会返回任何内容。有什么想法吗?构建一个从字符串到相应的
SomeEnum
值的映射:
Map<String, SomeEnum> map =
Arrays.stream(SomeEnum.values()).collect(toMap(SomeEnum::toString, s -> s));
Map=
stream(SomeEnum.values()).collect(toMap(SomeEnum::toString,s->s));
(此操作可执行一次并存储)
然后,您可以在以下内容中查找:
List<SomeEnum> enumList = someStringList.stream().map(map::get).collect(toList());
List enumList=someStringList.stream().map(map::get).collect(toList());
(您可能希望也可能不希望处理映射中找不到字符串的情况:例如,您可以引发异常或删除此类元素)。从字符串到相应的
SomeEnum
值构建映射:
Map<String, SomeEnum> map =
Arrays.stream(SomeEnum.values()).collect(toMap(SomeEnum::toString, s -> s));
Map=
stream(SomeEnum.values()).collect(toMap(SomeEnum::toString,s->s));
(此操作可执行一次并存储)
然后,您可以在以下内容中查找:
List<SomeEnum> enumList = someStringList.stream().map(map::get).collect(toList());
List enumList=someStringList.stream().map(map::get).collect(toList());
(您可能希望也可能不希望处理在映射中找不到字符串的情况:例如,您可以引发异常或删除此类元素)。在
SomeEnum
中,您可以构建一个从字符串名称到枚举的映射,并在类加载期间对其进行初始化。然后在名为fromString
的SomeEnum
中声明一个公共静态方法,该方法返回给定字符串的枚举常量(如果存在)
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);
}
private静态最终映射stringToEnum=Arrays.stream(values())
.collect(Collectors.toMap(SomeEnum::toString,e->e));
公共静态SomeEnum fromString(字符串名称){
返回stringToEnum.get(名称);
}
然后在客户端代码中使用它。这是它的样子
List<SomeEnum> enumList = someStringList.stream()
.map(SomeEnum::fromString)
.collect(Collectors.toList());
List enumList=someStringList.stream()
.map(SomeEnum::fromString)
.collect(Collectors.toList());
在SomeEnum
中,您可以构建一个从字符串名称到enum的映射,并在类加载期间对其进行初始化。然后在名为fromString
的SomeEnum
中声明一个公共静态方法,该方法返回给定字符串的枚举常量(如果存在)
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);
}
private静态最终映射stringToEnum=Arrays.stream(values())
.collect(Collectors.toMap(SomeEnum::toString,e->e));
公共静态SomeEnum fromString(字符串名称){
返回stringToEnum.get(名称);
}
然后在客户端代码中使用它。这是它的样子
List<SomeEnum> enumList = someStringList.stream()
.map(SomeEnum::fromString)
.collect(Collectors.toList());
List enumList=someStringList.stream()
.map(SomeEnum::fromString)
.collect(Collectors.toList());
这是否回答了您的问题?不幸的是,没有,因为在所有类似的问题中,我发现只有一个字符串,而不是一个字符串列表。一旦在接受的答案中有了find
方法,就可以简单地进行调整。只需对字符串列表进行流式处理,map
,并使用find
的结果。拥有一个SomeEnum
值流,通过检查someStringList
是否包含要筛选的枚举值的name
,对其进行过滤,并将过滤后的枚举值收集到列表中。这是否回答了您的问题?不幸的是,没有,因为在所有类似的问题中,我发现只有一个字符串,而不是一个字符串列表。一旦在接受的答案中有了find
方法,就可以简单地进行调整。只需对字符串列表进行流式处理,map
并显示find
的结果。拥有一个SomeEnum
值流,通过检查someStringList
是否包含要筛选的枚举值的name
来过滤它,并将过滤后的枚举值收集到列表中