Saltar al contenido

Java 8 lambda para seleccionar el empleado con mejor salario para cada departamento

Haz todo lo posible por entender el código correctamente previamente a adaptarlo a tu proyecto si tdeseas aportar algo puedes comentarlo.

Solución:

Puedes hacerlo con un recopilador de agrupación:

Map topEmployees =
    allEmployees.stream()
                .collect(groupingBy(
                    e -> e.department,
                    collectingAndThen(maxBy(comparingInt(e -> e.salary)), Optional::get) 
                ));

con el static importaciones

import static java.util.Comparator.comparingInt;
import static java.util.stream.Collectors.collectingAndThen;
import static java.util.stream.Collectors.groupingBy;
import static java.util.stream.Collectors.maxBy;

Este código crea un Stream de todos los empleados y los agrupa con su departamento con la ayuda de Collectors.groupingBy. Para todos los valores clasificados al mismo keynecesitamos mantener solo al empleado con el salario máximo, por lo que los cobramos con Collectors.maxBy y el comparador compara el salario con Comparator.comparingInt. Ya que maxBy devuelve un Optional (para manejar el caso donde la lista está vacía), lo envolvemos con una llamada a Collectors.collectingAndThen con un finalizador que solo devuelve al empleado: sabemos en este caso que el opcional no estará vacío.

Solución alternativa:

Map topEmployees =
    allEmployees.stream()
            .collect(Collectors.toMap(
                e -> e.department,
                e -> e,
                BinaryOperator.maxBy(Comparator.comparingInt(e -> e.salary)) 
            ));

Cuando nos encontramos con el primer empleado del departamento, agregamos una nueva entrada a la Map. Cuando se encuentra otro empleado, se mantiene uno con mayor salario. De esta manera, no necesita entrometerse con las opciones.

/Digamos que tiene una lista de empleados como List employeeList; Para encontrar el salario por departamento, primero necesita tener un comparador para empleados/

Comparator bySalary = Comparator.comparing(Employee::getSalary);

Luego, para encontrar el salario más alto sabio del departamento que haces

Map> collect = 
        employeeList.stream().collect(
            Collectors.groupingBy(
                Employee::getDept,
                Collectors.reducing(BinaryOperator.maxBy(bySalary))
    )
);

Lo que estamos haciendo aquí es agrupar a los empleados en función de su departamento. Y junto con Agrupación, decimos que me devuelvan el asalariado más alto para ese departamento y, finalmente, elijan solo uno como máximo. Para ver el método de anulación de salida toString en la clase de empleado y hacer */

collect.entrySet().stream().forEach(System.out::println);

valoraciones y reseñas

Si te ha sido útil nuestro artículo, sería de mucha ayuda si lo compartes con otros programadores y nos ayudes a difundir nuestra información.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *