Eu tenho um fluxo de ordens (a fonte sendo uma lista de pedidos). Cada pedido tem um cliente, e uma lista de OrderLine.
O que eu estou tentando alcançar é ter um mapa com o cliente como a chave, e todas as linhas de pedidos pertencentes a esse cliente, em uma lista simples, como valor.
O que eu consegui agora me uma volta Map<Customer>, List<Set<OrderLine>>>
, fazendo o seguinte:
orders
.collect(
Collectors.groupingBy(
Order::getCustomer,
Collectors.mapping(Order::getOrderLines, Collectors.toList())
)
);
Ou eu estou olhando para obter um Map<Customer, List<OrderLine>>
diretamente do fluxo de ordens, ou por alguma forma achatando a lista de um córrego do Map<Customer>, List<Set<OrderLine>>>
que eu tenho acima.
Você pode simplesmente usar Collectors.toMap
.
Algo como
orders
.stream()
.collect(Collectors
.toMap(Order::getCustomer
, Order::getOrderLines
, (v1, v2) -> { List<OrderLine> temp = new ArrayList<>(v1);
temp.addAll(v2);
return temp;});
O terceiro argumento para a toMap
função é a função merge. Se você não prever expressamente que e há uma chave duplicada, em seguida, ele irá lançar o erro ao terminar a operação.