El colecter Collectors.toMap proporciona tres sobrecargas principales para transformar flujo en mapas.
Definiciones de métodos
toMap(Function<? super T, ? extends K> claveMapeo, Function<? super T, ? extends U> valorMapeo);
toMap(Function<? super T, ? extends K> claveMapeo, Function<? super T, ? extends U> valorMapeo,
BinaryOperator<U> funcionCombinadora);
toMap(Function<? super T, ? extends K> claveMapeo, Function<? super T, ? extends U> valorMapeo,
BinaryOperator<U> funcionCombinadora, Supplier<M> proveedorMapa);
Los parámetros clave son: claveMapeo (extrae la clave del mapa), valorMapeo (determina el valor), funcionCombinadora (resuelve duplicados) y proveedorMapa (proveee una implementación específica de Map).
Implemantación práctica
public class Cliente {
private String identificador;
private double saldo;
public Cliente(String identificador, double saldo) {
this.identificador = identificador;
this.saldo = saldo;
}
public String getIdentificador() { return identificador; }
public double getSaldo() { return saldo; }
}
import java.util.*;
import java.util.stream.*;
public class EjemploToMap {
public static void main(String[] args) {
List<Cliente> clientes = Arrays.asList(
new Cliente("C100", 1500.50),
new Cliente("C200", 3200.75),
new Cliente("C300", 890.25),
new Cliente("C400", 4100.00)
);
// Conversión básica clave-valor
Map<String, Double> mapaSaldos = clientes.stream()
.collect(Collectors.toMap(
Cliente::getIdentificador,
Cliente::getSaldo
));
// Mapeo con objetos completos
Map<String, Cliente> mapaClientes = clientes.stream()
.collect(Collectors.toMap(
Cliente::getIdentificador,
cliente -> cliente
));
// Agregamos cliente con identificador duplicado
clientes.add(new Cliente("C200", 550.00));
// Manejo de claves duplicadas: priorizar último
Map<String, Cliente> mapaActualizado = clientes.stream()
.collect(Collectors.toMap(
Cliente::getIdentificador,
cliente -> cliente,
(anterior, nuevo) -> nuevo
));
// Lanzamiento personalizado para duplicados
try {
Map<String, Cliente> mapaEstricto = clientes.stream()
.collect(Collectors.toMap(
Cliente::getIdentificador,
cliente -> cliente,
(existente, duplicado) -> {
throw new IllegalStateException(
"Identificador duplicado: " + existente.getIdentificador()
);
}
));
} catch (IllegalStateException e) {
System.err.println("Error: " + e.getMessage());
}
}
}