Saya harus List
dari Employee
s dengan tanggal bergabung berbeda. Saya ingin Mendapatkan Karyawan sebelum dan setelah tanggal tertentu bergabung dari Daftar menggunakan aliran.
saya mencoba kode berikut,
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;
}
Apakah ada cara untuk melakukan ini dalam satu aliran?
partitioningBy
Jawaban:
Anda dapat menggunakan
partitioningBy
seperti di bawah ini,partisiing Dengan Mengembalikan Kolektor yang mempartisi elemen input sesuai dengan Predikat, dan mengaturnya menjadi a
Map<Boolean, List<T>>
Perhatikan bahwa ini tidak akan menangani karyawan
specificDate
.sumber
specificDate
akan mendarat difalse
partisi, di mana dalam kode tersebut tidak adaspecificDate.plusDays(1)
menyelesaikan masalah?specificDate
akan tetap difalse
bagian.true
partisi ...Jika daftar Anda dapat memiliki entri yang bergabung pada
specificDate
, maka Anda mungkin menemukangroupingBy
berguna:The
result
peta berisiEmployee
catatan dikelompokkan berdasarkan posisi relatif untukspecificDate
, sehingga Anda dapat memilih yang bergabung sebelum, sesudah, atau pada tanggal yang ditentukan.sumber
compareTo
hanya akan mengembalikan -1, 0, atau 1. Faktanya LocalDate.compareTo dapat mengembalikan int apa pun.compareTo
dan memanggilnyaInteger.signum
.Anda perlu menyaring karyawan dengan tanggal khusus ini. Kemudian Anda dapat menggunakan partisi:
Ini akan membuat peta koleksi berdasarkan jika mereka memenuhi predikat.
sumber
partitioningBy
hari ini.Anda dapat menggunakan
Collectors.groupingBy
dan menggunakancompareTo
metode untuk mengelompokkan daftar karyawan berdasarkan tanggal sebelumnya, saat ini dan masa depanJadi hasilnya akan
sumber