En una corriente de Java 8, la forma de filtrar las cadenas que no son válidos los valores de una enumeración?

workerjoe:

Tengo una enumeración llamada que Permissionde 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 mappaso 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 filtersalir de esos valores para que se ignoran tranquilamente sin lanzar excepciones?

Ravindra Ranwala:

Primero puede codificar las Permissionconstantes de enumeración en una Setde las cuerdas y luego usar eso en su filterpredicado para filtrar valores no válidos. A continuación, utilice un .mapoperador 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 isValiden 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());

Supongo que te gusta

Origin http://10.200.1.11:23101/article/api/json?id=477344&siteId=1
Recomendado
Clasificación