Reescribir doble anidado para el bucle como una corriente de Java 8

hotmeatballsoup:

Tengo el siguiente método Java:

public List<GrantedAuthority> toAuthorities(Set<Role> roles) {
    List<GrantedAuthority> authorities = new ArrayList<>();

    if (null != roles) {
        for (Role role : roles) {
            for (Permission permission : role.getPermissions()) {
                authorities.add(new SimpleGrantedAuthority("ROLE_" + permission.getLabel()));
            }
        }
    }

    return authorities;
}

Estoy intentando volver a escribir utilizando Java 8 corrientes. Mi mejor intento hasta el momento:

public List<GrantedAuthority> toAuthorities(Set<Role> roles) {
    List<GrantedAuthority> authorities = new ArrayList<>();

    if (null != roles) {
        roles.stream().filter(role -> ???).collect(Collectors.toList());
    }

    return authorities;
}

Pero estoy en una pérdida en cuanto a lo que he puesto en el filtro de secuencia (sustitución ???) ... alguna idea?

también:

Puede hacerlo utilizando flatMapy mapinstaead como:

if (null != roles) {
    authorities = roles.stream()
         .flatMap(role -> role.getPermissions().stream()) // Stream<Permission>
         .map(permission -> 
                 new SimpleGrantedAuthority("ROLE_" + permission.getLabel())) // Stream<SimpleGrantedAuthority>
         .collect(Collectors.toList());
}

En el forcódigo de bucle, no se está filtrando hacia fuera / en cualquier iteración basado en una condición y la iteración a través de las listas, por lo tanto, no se requiere una filteraquí.


Y utilizando el método por encima de su completa se puede escribir como:

public List<GrantedAuthority> toAuthorities(Set<Role> roles) {
    return roles == null ? new ArrayList<>() : roles.stream()
            .flatMap(role -> role.getPermissions().stream())
            .map(permission -> new SimpleGrantedAuthority("ROLE_" + permission.getLabel()))
            .collect(Collectors.toList());
}

O, como lo sugiere shmosel , con referencias de métodos que esto podría ser transformado como:

return roles == null ? new ArrayList<>() : roles.stream()
        .map(Role::getPermissions)
        .flatMap(Collection::stream)
        .map(Permission::getLabel)
        .map("ROLE_"::concat)
        .map(SimpleGrantedAuthority::new)
        .collect(Collectors.toList());

Supongo que te gusta

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