Então, eu ainda sou novo para Java 8 e ainda lutando para correlacionar a API com iteração e coleções tradicional córregos.
Então, eu tenho uma lista de objeto "UserData" que tem 3 propriedades, a lista é todos os dados desnormalizada.
public class UserData {
private String primaryAccountNumber;
private String subAccountNumber;
private String currency;
}
Entrada de dados de exemplo seria 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
O resultado esperado deve ser algo como
USD -> PA00 -> [US00]
PA01 -> [US01,US02]
EUR -> PA02 -> [EU00]
-> PA03 -> [EU01]
CAD -> PA04 -> [CA00,CA01]
INR -> null (or dummykey)->[IN00,IN01]
Então, eu quero que ele seja normalizada de uma forma tal que a saída vem é um mapa chaveado com moeda eo valor deve ser outra Mapa chaveado com Prec primária e valor com lista de sub Contas.
Map<String, Map<String,List<String>>> normalizedData = //logic
Eu estava pensando em fazer desta forma oldschool, basicamente,
- Organizar os dados com base em moeda corrente.
- Iterate da lista e colocar os dados no mapa (desde os dados são classificados e até eu pegar as chaves duplicadas vai começar a colocar os dados correspondentes (conta principal num novo Mapa)
- Repetir o processo acima basicamente ao nível conta principal e começar a colocar a chave duplicada de dados de valor correspondente (sub contas em um objeto da lista)
Quanto ao meu processo de pensamento que eu tenho que criar 2 Lista de cópias (1 classificar a moeda para a primeira iteração), 2 nd tipo de conta principal por mapa aninhada. Parece pouco ineficiente, então eu olhei para os fluxos, mas não podia visualizar como eu posso usá-los, mas qualquer orientação ou pensamentos seria apreciada.
É bastante simples com fluxos. Você precisa de um par de agrupamentos aninhados e um mapeamento no final. Por uma questão de brevidade, eu vou assumir que tem uma importação estática java.util.stream.Collectors.*
.
Map<String, Map<String, List<String>>> normalizedData = users.stream().collect(
groupingBy(UserData::getCurrency,
groupingBy(UserData::getPrimaryAccountNumber,
mapping(UserData::getSubAccountNumber, toList()))));
Note-se que groupingBy()
não permite chaves nulas , assim você pode realmente ter de usar uma chave de manequim.