java - 在 Java 8 流中,如何过滤掉不是 Enum 有效值的字符串?

标签 java exception enums java-stream filtering

我有一个枚举,我称之为Permission对我的应用程序很重要的安全权限。在数据库中,用户可能拥有与我的应用程序无关的附加权限。从数据库读取用户时,我得到 List<String>我想建立一个 List<Permission> ,忽略那些不是枚举值的字符串。

public enum Permission { ADMIN, USER }

List<String> plaintextAuthorities = List.of("ADMIN","USER","COFFEEMAKER")

List<Permission> appPermissions = plaintextAuthorities.stream()
        .map(Permission::valueOf) // this will throw an IllegalArgumentException for 'COFFEEMAKER'
        .collect(Collectors.toList());

问题是map当步骤到达与枚举值不对应的字符串之一时,它将引发异常。我怎样才能filter输出这些值,以便它们被悄悄地忽略而不抛出异常?

最佳答案

您可以首先将Permission枚举常量编码为Set字符串,然后在filter谓词中使用它来过滤掉无效值。然后使用 .map 运算符从字符串表示形式中解码枚举常量,仅获取有效值。这是它的样子。

Set<String> strPermissionSet = Arrays.stream(Permission.values())
    .map(Permission::name)
    .collect(Collectors.toSet());

Set<Permission> appPermissions = plaintextAuthorities.stream()
    .filter(strPermissionSet::contains)
    .map(Permission::valueOf)
    .collect(Collectors.toSet());

不过,您最好在枚举类型中声明一个名为 isValid 的静态方法,以便给定一个字符串值,用户可以检查它是否表示有效的枚举常量。这是它的样子。

public enum Permission {
    ADMIN, USER;

    private static final Set<String> strPermissions = 
        Arrays.stream(values())
        .map(Permission::name)
        .collect(Collectors.toSet());

    public static boolean isValid(String val) {
        return strPermissions.contains(val);
    }
}

现在您的客户端代码应如下所示:

Set<Permission> appPermissions = plaintextAuthorities.stream()
    .filter(Permission::isValid)
    .map(Permission::valueOf)
    .collect(Collectors.toSet());

关于java - 在 Java 8 流中,如何过滤掉不是 Enum 有效值的字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60210764/

相关文章:

java - Maven: 'Package does not exist'(和其他错误)

java - 从给定的 Map 到 json 字符串(或 JSONObject)

ios - 未捕获的异常 'NSGenericException : application has presented a UIAlertController of style UIAlertControllerStyleActionSheet

grails - 如何创建与 Grails 一起使用的枚举

Python 元类为类生成正确的枚举值

c# - 存储可以循环编辑的列表?

javascript - 如何使用 HTMLUnit 编写事件处理程序并检测某些 JavaScript 调用?

java - BindingAdapter 未被识别为适用于具有泛型的属性

django - 如何关闭 Sentry Web UI 异常跟踪中的变量缩短?

c# - RFC_READ_TABLE 查询大量列后抛出 Rfcabapexception