Я имею List
в Employee
с с различными датами присоединения. Я хочу получить сотрудников до и после определенной даты присоединения из списка с помощью потоков.
я попробовал следующий код,
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;
}
Есть ли способ сделать это в одном потоке?
partitioningBy
Ответы:
Вы можете использовать
partitioningBy
как ниже,partitioningBy Возвращает Collector, который разделяет входные элементы в соответствии с предикатом и организует их в
Map<Boolean, List<T>>
Обратите внимание, что это не будет работать с сотрудниками
specificDate
.источник
specificDate
темfalse
, что они попадают в раздел, тогда как в соответствующем коде нетspecificDate.plusDays(1)
решает проблему?specificDate
все еще будет вfalse
части.true
разделе ...Если в вашем списке могут быть записи , присоединившиеся к
specificDate
, то вам можетgroupingBy
пригодиться:result
Карта содержитEmployee
записи , сгруппированные по положению относительноspecificDate
, так что вы можете выбрать , кто присоединился к до, после или на указанную дату.источник
compareTo
вернет только -1, 0 или 1. На самом деле LocalDate.compareTo может вернуть любое значение типа int.compareTo
и позвонитьInteger.signum
по нему.Вы должны отфильтровать сотрудников с этой конкретной датой. Тогда вы можете использовать разбиение:
Это создаст карту коллекций на основе того, соответствуют ли они предикату.
источник
partitioningBy
сегодня.Вы можете использовать
Collectors.groupingBy
и использоватьcompareTo
метод для группировки списка сотрудников на основе предыдущей, текущей и будущей датыТаким образом, выход будет
источник