Ich habe List
von Employee
s mit unterschiedlichen Beitrittsdaten. Ich möchte Mitarbeiter vor und nach einem bestimmten Beitrittsdatum von der Liste mithilfe von Streams abrufen.
Ich habe versucht, folgenden 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;
}
Gibt es eine Möglichkeit, dies in einem einzigen Stream zu tun?
partitioningBy
Antworten:
Sie können
partitioningBy
wie folgt verwenden:partitioningBy Gibt einen Collector zurück, der die Eingabeelemente nach einem Prädikat partitioniert und in a organisiert
Map<Boolean, List<T>>
Beachten Sie, dass dies keine Mitarbeiter mit behandelt
specificDate
.quelle
specificDate
landen in derfalse
Partition, wo im fraglichen Code keinespecificDate.plusDays(1)
das Problem durch Hinzufügen behoben?specificDate
wird noch in demfalse
Teil sein.true
Partition sein ...Wenn Ihre Liste Einträge enthalten kann, die dem beigetreten sind
specificDate
, finden Sie möglicherweise FolgendesgroupingBy
nützlich:Die
result
Karte enthältEmployee
Datensätze, die nach Position relativ zu gruppiert sindspecificDate
, sodass Sie auswählen können, wer vor, nach oder am angegebenen Datum beigetreten ist.quelle
compareTo
nur -1, 0 oder 1 zurückgegeben wird. Tatsächlich kann LocalDate.compareTo jedes int zurückgeben.compareTo
und es aufrufenInteger.signum
.Sie müssen Mitarbeiter mit diesem bestimmten Datum herausfiltern. Dann können Sie die Partitionierung verwenden:
Dadurch wird eine Karte mit Sammlungen erstellt, die darauf basiert, ob sie das Prädikat erfüllen.
quelle
partitioningBy
Heute gelernt .Sie können mit
Collectors.groupingBy
Einsatz undcompareTo
auf früheren, Liste basiert Mitarbeiter Methode für die Gruppierung der aktuellen und zukünftigen DatumSo wird die Ausgabe sein
quelle