Estoy trabajando en una aplicación Java y estoy tratando de entender si el concepto Stream puede ser útil para mi caso de uso.
Estoy tratando de hacer algo similar a lo que encontré en un ejemplo, pero mi caso de uso parece ser más complejo. Este fue el ejemplo original:
String[] profili = utente.getRuoli() .stream().map(a -> "ROLE_" + a).toArray(String[]::new);Básicamente, está creando una matriz a partir de una secuencia.
Siguiendo mi situación. Tengo esta clase DTO de usuario principal que representa a un usuario:
@Data public class User { private int id; private String firstName; private String middleName; private String surname; private char sex; private Date birthdate; private String taxCode; private String eMail; private String pswd; private String contactNumber; private Date createdAt; private Set<Address> addressesList; private Set<UserType> userTypes; }La clase DTO anterior contiene este campo que representa una colección de tipos de usuarios (por ejemplo, "ADMIN", "LECTOR", "ESCRITOR", etc.). Esto porque un usuario puede tener varios tipos:
private Set<UserType> userTypes;Esta es la estructura UserType :
@Data public class UserType { private int id; private String typeName; private String description; Set<Operation> operations; }Además, esta clase contiene un campo que representa una colección de operaciones (esto porque un tipo de usuario puede tener varias operaciones que puede realizar en el sistema), este campo:
Set<Operation> operations;Ahora pregunto si puedo usar la secuencia de manera similar al ejemplo original para crear una matriz de todas las operaciones contenidas en todos los tipos de usuarios.
¿Es posible? ¿Cuál podría ser una solución inteligente? O tal vez la mejor manera es el "estilo antiguo" (¿iterar en todo el objeto en el conjunto de tipos de usuario, luego iterar en todo el elemento en el conjunto de operaciones y agregarlo manualmente a una matriz?). Funcionará, pero ¿cuál podría ser una solución ordenada y elegante usando stream? (si existe)
Usa flatMap() en las operaciones Set , con distint( distinct() :
Operation[] operations = user.getUserTypes().stream() .map(UserType::getOperations) .flatMap(Set::stream) .distinct() .toArray(Operation[]::new);Parece que lo que quieres es solo
userList.stream() .flatMap(user -> user.getUserTypes().stream()) .flatMap(userType -> userType.getOperations().stream()) .toArray(Operation[]::new);...asumiendo que estás usando captadores. Esto le brinda todas las operaciones para cada tipo de usuario para cada usuario.