Java akışına sahip Çalışan Listesinden belirli bir katılım tarihinden önce ve sonra Çalışanları edinin


9

Farklı katılma tarihleri Listolan Employees var . Akışları kullanarak Listeden belirli bir katılım tarihinden önce ve sonra Çalışanları Almak istiyorum.

aşağıdaki kodu denedim,

 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;
}

Bunu tek akışta yapmanın bir yolu var mı?


1
KullanabilirsinizpartitioningBy
Code_Mode

5
Önce ve sonra - randevuya katılanlar dışındaki tüm çalışanlara mı ihtiyacınız var?
John3136

"En azından o zamandan beri bir çalışan" olduğunu varsayarsak, daha önce değil, daha önce değil, hiç de umursamamak isteyeceksiniz.
JollyJoker

Yanıtlar:


16

partitioningByAşağıdaki gibi kullanabilirsiniz ,

Map<Boolean, List<Employee>> listMap = employeeList.stream()
        .collect(Collectors.partitioningBy(e -> e.joiningDate.isAfter(specificDate)));

List<Employee> employeeListAfter = listMap.get(true);
List<Employee> employeeListBefore = listMap.get(false);

partitioningBy Girdi öğelerini bir Öngörüye göre bölümleyen ve bunları birMap<Boolean, List<T>>

Bunun çalışanlarla ilgilenmeyeceğini unutmayın specificDate.


1
Kod açıklaması harika olacak.
Vishwa Ratna

2
Bu tam olarak yapmaz, söz konusu kod ne yapar - çalışanlar bölüme specificDateinecek false, söz konusu kodda hiçbiri yok
Andronicus

Eklemek specificDate.plusDays(1)sorunu nasıl çözer? specificDatehala bir falseparçası olacak.
Andronicus

Sonra truebölümün içinde olacak ...
Andronicus

1
@Andronicus: Yalnızca OP bu davranışın bir hata mı yoksa bir özellik mi olduğunu bilir. Bana göre, hiçbir çalışanı dışarıda bırakmamak daha güvenli görünüyor.
Eric Duminil

9

Listenizi girişleri olabilir Eğer katıldıspecificDate , o zaman bulabilir groupingBykullanışlı:

Map<Integer, List<Employee>> result = employeeList.stream()
    .map(emp -> new AbstractMap.SimpleEntry<>(specificDate.compareTo(emp.getJoiningDate()), emp))
    .collect(Collectors.groupingBy(entry -> entry.getKey() > 0 ? 1 : (entry.getKey() < 0 ? -1 : 0),
            Collectors.mapping(entry -> entry.getValue(), Collectors.toList())));

employeeListAfter = result.get(-1);
employeeListBefore = result.get(1);
employeeListOnSpecificDate = result.get(0);

resultHarita içeriyor Employeenispeten pozisyonda göre gruplandırılmış kayıtlar specificDatesen önce, sonra katılan kim seçebilir veya belirtilen tarihte böylece.


Bu kabul edilen cevap olmalı
Andronicus

2
-1. compareToYalnızca -1, 0 veya 1 döndürecek yanlış varsayımı yapıyorsunuz . Aslında LocalDate.compareTo herhangi bir int döndürebilirsiniz.
MikeFHay

1
@MikeFHay Bunu işaret ettiğiniz için teşekkürler. Çok hızlı bir test yaptım ve sonuçlara atladım. Uygulama değişti (ve aniden karmaşık görünüyor).
ernest_k

2
@ernest_k: Orijinali kullanabilir compareTove Integer.signumonu arayabilirsiniz .
Eric Duminil

1
@JollyJoker Sadece bilmiyordum durumda, github belirli hattına bağlantı verebilirsiniz: gibi bu . Satır numarasını tıklamak URL'yi doğrudan değiştirir. Zaten bildiğiniz veya umursamadığınızda görmezden gelmekten çekinmeyin. ;)
Eric Duminil

4

Çalışanları bu belirli tarihe göre filtrelemeniz gerekir. Ardından bölümlemeyi kullanabilirsiniz:

Map<Boolean, List<Employee>> partitioned = employeeList.stream()
    .filter(e -> !e.joiningDate.equals(specificDate))
    .collect(partitioningBy(e -> e.joiningDate.isAfter(specificDate)));

List<Employee> employeeListAfter = partitioned.get(true);
List<Employee> employeeListBefore = partitioned.get(false);

Bu, yüklemi yerine getirip getirmediklerine göre bir koleksiyon haritası oluşturacaktır.


partitioningBy Bugün öğrendim .
Vishwa Ratna

Hayır, yalnızca belirli
uygulayamazsınız

@Code_Mode oh, evet, bunu kaçırdım, teşekkür ederim!
Andronicus

2

Çalışan listesini önceki, şimdiki ve gelecekteki tarihe göre gruplandırmak Collectors.groupingByiçin compareToyöntemi kullanabilir ve kullanabilirsiniz

Map<Integer, List<Employee>> result = employeeList.stream()
            .collect(Collectors.groupingBy(e-> e.joiningDate.compareTo(specificDate)< 0 ? -1 : (e.joiningDate.compareTo(specificDate) == 0 ? 0 : 1)));

Böylece çıktı

key--> -1 ---> will have employees with previous date
key--> 0 ---> will have employees with current date
key--> 1 ---> will have employees with future date
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.