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 flatMap
y map
instaead 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 for
có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 filter
aquí.
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());