我有一个枚举,我称之为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/