Java比较字符串数组与enumset

dwthyt8l  于 2023-03-21  发布在  Java
关注(0)|答案(3)|浏览(92)

我得到了一组枚举。

EnumSet<States> statesSet = Enum.allOf(States.class);

Public enum States{
     stateA
     stateB
     stateC
}

我有一个字符串数组,其中可能包含一个枚举值,例如。

String[] potentialStates = [xyz, stateA, abc];

现在我需要比较数组中的任何字符串是否与枚举值匹配
为了做到这一点,我创建了一个流

boolean isStateValid = Arrays.stream(potentailStates).anyMatch(statesSet::contains);

因为我在比较字符串和枚举,所以我知道没有匹配。但是我很难把字符串数组转换成枚举集。有没有简单的方法可以做到这一点?

xytpbqjk

xytpbqjk1#

在枚举中,您可以创建一个方法来检查,例如:

enum States {
    stateA,
    stateB,
    stateC;

    private static final List<String> NAMES = Stream.of(States.values())
            .map(Enum::name)
            .toList();

    public static boolean check(String name) {
        return NAMES.contains(name);
    }
}

然后你可以用途:

.anyMatch(States::check);
x6492ojm

x6492ojm2#

在Stream.map您的情况下,可以使用www.example.com()将字符串流转换为枚举流:
返回一个流,该流由将给定函数应用于此流的元素的结果组成。
我想给States添加一个更自由的解析方法,如果字符串不能被解析,它会返回null,而不是抛出异常来保持流管道的干净。一个可能的实现:

public enum States {
  stateA,
  stateB,
  stateC;

  public static States liberalParse(String string) {
    try {
      return States.valueOf(string);
    } catch (Exception exc) {
      return null;
    }
  }
}

溪流:

boolean isStateValid = Arrays.stream(potentialStates)
            .map(States::liberalParse)
            .filter(Objects::nonNull)
            .anyMatch(statesSet::contains);

与实际问题无关,但根据java约定,enum名称应该是这样的-STATE_ASTATE_B等。
另外,枚举应该命名为State(单数),因为它的一个示例(STATE_A)代表一个状态。

ocebsuys

ocebsuys3#

您可以直接将字符串转换为ConvTypeEnum枚举值,并将它们与try-catch块结合使用。

boolean isStateValid = Arrays.stream(potentialStates)
    .anyMatch(state -> {
        try {
            return statesSet.contains(States.valueOf(state));
        } catch (IllegalArgumentException e) {
            return false;
        }
    });

相关问题