Tengo una enumeración llamada que Permission
de permisos de seguridad que importa a mi solicitud. En la base de datos, el usuario puede tener permisos adicionales que no son relevantes a mi solicitud. Al leer el usuario de la base de datos, aparece un List<String>
y quiero construir una List<Permission>
, haciendo caso omiso de esas cadenas que no son valores de la enumeración.
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());
El problema es que el map
paso será lanzar una excepción cuando se llega a una de las cadenas que no se corresponde con un valor de la enumeración. ¿Cómo puedo filter
salir de esos valores para que se ignoran tranquilamente sin lanzar excepciones?
Primero puede codificar las Permission
constantes de enumeración en una Set
de las cuerdas y luego usar eso en su filter
predicado para filtrar valores no válidos. A continuación, utilice un .map
operador para decodificar la enumeración constantes de vuelta de la representación de cadena única de valores válidos. Así es como se ve.
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());
Sin embargo, usted es el mejor de declarar un método estático denominado isValid
en su tipo de enumeración de manera que da un valor de cadena de un usuario puede comprobar si representa una constante de enumeración válida o no. Así es como se ve.
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);
}
}
Y ahora su código de cliente debe tener este aspecto:
Set<Permission> appPermissions = plaintextAuthorities.stream()
.filter(Permission::isValid)
.map(Permission::valueOf)
.collect(Collectors.toSet());