J'ai List
des Employee
s avec différentes dates d'adhésion. Je souhaite obtenir des employés avant et après une date précise d'adhésion à partir de la liste à l'aide de flux.
j'ai essayé de suivre le code,
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;
}
Existe-t-il un moyen de le faire en un seul flux?
partitioningBy
Réponses:
Vous pouvez utiliser
partitioningBy
comme ci-dessous,partitioningBy Renvoie un collecteur qui partitionne les éléments d'entrée en fonction d'un prédicat et les organise en un
Map<Boolean, List<T>>
Notez que cela ne gérera pas les employés avec
specificDate
.la source
specificDate
atterriront enfalse
partition, alors que dans le code en question aucunspecificDate.plusDays(1)
résout-il le problème?specificDate
sera toujours dans lafalse
partie.true
partition ...Si votre liste peut contenir des entrées qui se sont jointes à la
specificDate
, vous pouvez trouvergroupingBy
utile:La
result
carte contient desEmployee
enregistrements regroupés par position par rapport àspecificDate
, de sorte que vous pouvez choisir qui s'est joint avant, après ou à la date spécifiée.la source
compareTo
ne renverra que -1, 0 ou 1. En fait, LocalDate.compareTo peut renvoyer n'importe quel entier.compareTo
et y faire appelInteger.signum
.Vous devez filtrer les employés avec cette date particulière. Ensuite, vous pouvez utiliser le partitionnement:
Cela créera une carte des collections en fonction de si elles remplissent le prédicat.
la source
partitioningBy
aujourd'hui.Vous pouvez utiliser
Collectors.groupingBy
et utiliser lacompareTo
méthode pour regrouper la liste des employés en fonction de la date précédente, actuelle et futureAinsi, la sortie sera
la source