Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/drupal/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用流返回枚举中包含的给定字符串列表的枚举数组_Java_Arraylist_Enums_Java Stream - Fatal编程技术网

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
来过滤它,并将过滤后的枚举值收集到列表中