Mam List
z Employee
s z różnymi datami łączenia. Chcę uzyskać pracowników przed określoną datą dołączenia z listy i po niej za pomocą strumieni.
próbowałem śledzić kod,
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;
}
Czy można to zrobić w jednym strumieniu?
partitioningBy
Odpowiedzi:
Możesz użyć
partitioningBy
jak poniżej,partitioningBy Zwraca moduł zbierający, który dzieli elementy wejściowe zgodnie z predykatem i organizuje je w
Map<Boolean, List<T>>
Pamiętaj, że nie będzie to obsługiwać pracowników
specificDate
.źródło
specificDate
, którzy wylądują wfalse
partycji, gdzie nie ma żadnego koduspecificDate.plusDays(1)
rozwiązuje problem?specificDate
nadal będzie w tejfalse
części.true
partycji ...Jeśli twoja lista może zawierać wpisy, które dołączyły
specificDate
, być możegroupingBy
przydatne:result
Ulicami zawieraEmployee
zapisy pogrupowane według położenia względemspecificDate
, więc można wybrać, który dołączył przed, po lub w określonym dniu.źródło
compareTo
zwróci tylko -1, 0 lub 1. W rzeczywistości LocalDate.compareTo może zwrócić dowolną liczbę całkowitą.compareTo
i wywołaćInteger.signum
go.Musisz odfiltrować pracowników z tą konkretną datą. Następnie możesz użyć partycjonowania:
Spowoduje to utworzenie mapy kolekcji na podstawie tego, czy spełniają one predykat.
źródło
partitioningBy
dzisiaj.Możesz użyć
Collectors.groupingBy
i użyćcompareTo
metody grupowania listy pracowników na podstawie poprzedniej, bieżącej i przyszłej datyWięc wynik będzie
źródło