Uso avanzado de Collectors.toMap en Java

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());
        }
    }
}

Etiquetas: java Streams collectors Map collections

Publicado el 6-24 21:25