Lambda ifadesi kullanılarak elemanın var olup olmadığı nasıl kontrol edilir?


118

Özellikle, TabPane'im var ve içinde belirli bir kimliği olan bir öğe olup olmadığını öğrenmek istiyorum.

Yani, bunu Java'daki lambda ifadesiyle yapmak istiyorum:

boolean idExists = false;
String idToCheck = "someId";

for (Tab t : tabPane.getTabs()){
    if(t.getId().equals(idToCheck)) {
        idExists = true;
    }
}

Yanıtlar:


273

anyMatchLambda İfadesini kullanmayı deneyin . Çok daha iyi bir yaklaşım.

 boolean idExists = tabPane.getTabs().stream()
            .anyMatch(t -> t.getId().equals(idToCheck));

11
Ayrıca şunu da belirtmek gerekir: noneMatchyerine çek kullanın anyMatch.
Blacklight

Çağrı, API seviyesi 24 gerektirir
FabioLux

50

Kabul edilen cevap doğru olsa da, daha zarif bir versiyon ekleyeceğim (bence):

boolean idExists = tabPane.getTabs().stream()
    .map(Tab::getId)
    .anyMatch(idToCheck::equals);

.Tml dosyasını uygulamadan önce veri yapısını düzleştirmeye izin veren Stream # map () kullanmayı ihmal etmeyin Predicate.


3
burada daha iyi olan ne? Sadece bir operasyon daha görüyorum. Üzgünüm bu lamba şeyinde yeniyim.
TecHunter

2
@TecHunter daha açık. Bu kodu ilk kez veya bir süre sonra tekrar okuduğunuzu hayal edin. Birkaç avantajı var: İlk olarak, hemen sekmeyle gerçekten ilgilenmediğimizi, bunun bazı haritalamalarıyla ilgilendiğimizi gösteriyoruz. İkinci olarak, yöntem referanslarını kullanarak (bu, yalnızca ilk lambdayı iki adıma böldüğümüz için mümkündür) kodda gizli sürprizlerin olmadığını gösteriyoruz. Üçüncüsü, yöntem referanslarını kullanarak yeni bir Predicate oluşturmuyoruz, sadece yeniden kullanıyoruz equals. Yine de, verilmiş, buradaki örnek çok basit, ama umarım ne demek istediğimi anlarsınız.
Malte Hartwig

@MalteHartwig teşekkürler! evet 3 puanınızı aldım ama düzleştirme hakkında soruyordum map, başka bir işlem adımı hayır mı? 2 yöntemi karşılaştırmaya çalışacağım :)
TecHunter

1
@MalteHartwig, son öğeyi bulmaya çalışan basit bir nesneyle 10kk ArrayList'te test edildi. sizin için 133 ms'ye karşı 2 ms'lik bir fark verir. 1kk'lik bir dizide 2ms (55ms - 53ms) daha hızlıysa sizinkini listeleyin. Yani sizinki daha iyi diyebiliriz :)
TecHunter

2
@TecHunter alıcıları süper ucuz. Ekstra 2 milisaniye tasarruf yerine her zaman kod netliğini tercih edin (sonuçların doğru olduğundan şüphe etsem de, her çalıştırmada dalgalanma gösterebilir). Ayrıca, akarsulardaki (gibi map) ara işlemlerin doğası gereği tembel olduğunu unutmayın. Bu, getIdyöntemin koleksiyonun her bir öğesine uygulanmadığı anlamına gelir . Bu kadar tembel değerlendirilen oluyor anyMatchgetiriler gerçek .
jFrenetic

3

Yukarıdaki cevaplar, yeni bir akış nesnesini malloc yapmanızı gerektirir.

public <T>
boolean containsByLambda(Collection<? extends T> c, Predicate<? super T> p) {

    for (final T z : c) {
        if (p.test(z)) {
            return true;
        }
    }
    return false;
}

public boolean containsTabById(TabPane tabPane, String id) {
    return containsByLambda(tabPane.getTabs(), z -> z.getId().equals(id));
}
...
if (containsTabById(tabPane, idToCheck))) {
   ...
}
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.