Por lo tanto, todavía soy nuevo en Java 8 y sigue luchando para correlacionar la API de Secuencia con iteración y colecciones tradicional.
Así que tengo una lista de objetos "UserData", que cuenta con 3 propiedades, la lista es todos los datos no normalizados.
public class UserData {
private String primaryAccountNumber;
private String subAccountNumber;
private String currency;
}
Ejemplo de entrada de datos sería como
PrimaryAccNumber SubAccNumber Currency
PA00 US00 USD
PA01 US01 USD
PA01 US02 USD
PA02 EU00 EUR
PA03 EU01 EUR
PA04 CA00 CAD
PA04 CA01 CAD
null IN00 INR
null IN01 INR
El resultado esperado debe ser algo como
USD -> PA00 -> [US00]
PA01 -> [US01,US02]
EUR -> PA02 -> [EU00]
-> PA03 -> [EU01]
CAD -> PA04 -> [CA00,CA01]
INR -> null (or dummykey)->[IN00,IN01]
Por lo tanto, yo quiero que se normalizará de tal manera que la salida viene es un mapa clave con la moneda y el valor debe ser otro mapa vehículo con Acc primaria y el valor con la lista de sub cuentas.
Map<String, Map<String,List<String>>> normalizedData = //logic
Yo estaba pensando en hacer de esta manera de la vieja escuela, básicamente,
- Clasificar los datos en función de la moneda.
- Iterar la lista y poner los datos en el mapa (ya está ordenada los datos y hasta que consigo las llaves duplicadas empezar a poner los datos correspondientes (cuenta principal en un nuevo mapa)
- Repita el proceso anterior, básicamente a nivel primario de la cuenta y empezar a poner la llave duplicada datos de valor correspondiente (subcuentas en un objeto de lista)
En cuanto a mi proceso de pensamiento que tengo que crear 2 copias de la lista (1 ordenar a las divisas para la primera iteración), 2ª clase en la cuenta principal para el mapa anidada. Parece poco ineficiente, entonces me miró a los arroyos, pero no podía visualizar cómo puedo usarlos pero cualquier orientación o pensamiento sería apreciado.
Es bastante sencillo con las corrientes. Se necesita un par de grupos anidados y un mapeo al final. En aras de la brevedad, asumiremos que tiene una importación estática de java.util.stream.Collectors.*
.
Map<String, Map<String, List<String>>> normalizedData = users.stream().collect(
groupingBy(UserData::getCurrency,
groupingBy(UserData::getPrimaryAccountNumber,
mapping(UserData::getSubAccountNumber, toList()))));
Tenga en cuenta que groupingBy()
no permite llaves nulas , por lo que puede de hecho tener que utilizar una llave falsa.