Tengo List
de Employee
s con diferentes fechas de ingreso. Quiero obtener empleados antes y después de una fecha específica de unirse a la lista mediante transmisiones.
Intenté seguir el código,
List<Employee> employeeListAfter = employeeList.stream()
.filter(e -> e.joiningDate.isAfter(specificDate))
.collect(Collectors.toList());
List<Employee> employeeListBefore = employeeList.stream()
.filter(e -> e.joiningDate.isBefore(specificDate))
.collect(Collectors.toList());
class Employee{
int id;
String name;
LocalDate joiningDate;
}
¿Hay alguna manera de hacer esto en una sola secuencia?
partitioningBy
Respuestas:
Puedes usar
partitioningBy
lo siguiente,PartitionBy Devuelve un recopilador que divide los elementos de entrada de acuerdo con un predicado y los organiza en un
Map<Boolean, List<T>>
Tenga en cuenta que esto no manejará a los empleados con
specificDate
.fuente
specificDate
aterrizarán en lafalse
partición, donde está el código en cuestión en ningunospecificDate.plusDays(1)
resolución resuelve el problema?specificDate
aún estará en lafalse
parte.true
partición ...Si su lista puede tener entradas que se unieron en el
specificDate
, entonces puede resultarlegroupingBy
útil:El
result
mapa contieneEmployee
registros agrupados por posición relativa aspecificDate
, por lo que puede elegir quién se unió antes, después o en la fecha especificada.fuente
compareTo
solo devolverá -1, 0 o 1. De hecho, LocalDate.compareTo puede devolver cualquier int.compareTo
y llamarloInteger.signum
.Debe filtrar a los empleados con esta fecha en particular. Entonces puedes usar la partición:
Esto creará un mapa de colecciones en función de si cumplen el predicado.
fuente
partitioningBy
hoy.Puede usar
Collectors.groupingBy
y usar elcompareTo
método para agrupar la lista de empleados en función de la fecha anterior, actual y futuraEntonces la salida será
fuente