Java 8 Özelliğe göre ayırt etme
Java 8'de Stream
API'sini kullanarak her nesnenin bir özelliğinin farklılığını kontrol ederek bir koleksiyonu nasıl filtreleyebilirim?
Örneğin, bir Person
nesnesi listem var ve aynı ada sahip kişileri kaldırmak istiyorum,
persons.stream().distinct();
Bir Person
nesnesi için varsayılan eşitlik kontrolünü kullanacak, bu yüzden şöyle bir şeye ihtiyacım var,
persons.stream().distinct(p -> p.getName());
Ne yazık ki distinct()
yönteminin böyle bir aşırı yüklemesi yoktur. Person` sınıfı içindeki eşitlik kontrolünü değiştirmeden bunu kısa ve öz bir şekilde yapmak mümkün mü?
405
3
Bir alternatif de isimleri anahtar olarak kullanarak kişileri bir haritaya yerleştirmek olabilir:
Çift isim olması durumunda, tutulan Kişinin ilk bulunan kişi olacağını unutmayın.
Kişi nesnelerini, yalnızca kişilerin adlarını karşılaştıran başka bir sınıfa sarabilirsiniz. Daha sonra, tekrar bir kişi akışı elde etmek için sarılmış nesneleri açarsınız. Akış işlemleri aşağıdaki gibi görünebilir:
Wrapper` sınıfı aşağıdaki gibi görünebilir:
Bunu uygulamanın en kolay yolu, bir öğenin özelliği kullanılarak oluşturulabilen isteğe bağlı bir
Comparator
sağladığı için sıralama özelliğine atlamaktır. Daha sonra, sıralanmış bir akış için tüm eşit öğelerin bitişik olduğu gerçeğini kullanan durum dolu birPredicate
kullanılarak yapılabilecek kopyaları filtrelemeniz gerekir:Elbette, statefull bir
Predicate
iş parçacığı güvenli değildir, ancak ihtiyacınız buysa bu mantığı birCollector
içine taşıyabilir veCollector
ınızı kullanırken iş parçacığı güvenliğini akışın halletmesine izin verebilirsiniz. Bu, sorunuzda bize söylemediğiniz farklı öğelerin akışıyla ne yapmak istediğinize bağlıdır.