2014-04-11 7 views

cevap

138

deneyin Lambda İfade anyMatch kullanmak. Bu çok daha iyi bir yaklaşım.

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

kabul cevap doğru olsa da, ben (Bence) daha şık bir sürümünü ekleyeceğiz:

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

ihmal uygulamadan önce veri yapısını düzleştirmek için izin verir Stream#map() kullanmıyor musunuz Predicate.

+2

Burada daha iyi olan nedir? Sadece bir operasyon daha görüyorum. Üzgünüm, bu lamba olayında yeniyim. – TecHunter

+2

@TecHunter daha açık. Bu kodu ilk defa veya bir süre sonra tekrar okuduğunuzu hayal edin. Birkaç avantajı vardır: Birincisi, hemen sekme ile ilgilenmediğimizi, ancak bunun bir miktar haritalandığını gösteriyoruz. İkincisi, yöntem referanslarını kullanarak (ki bu sadece ilk lambda'yı iki aşamaya ayırdığımız için mümkündür) kodda gizlenmiş sürprizlerin olmadığını gösteriyoruz. Üçüncüsü, yöntem referansları kullanarak, yeni bir Predicate oluşturmuyoruz, ama gerçekten sadece 'equals' kullanıyoruz. Yine de, verilen örnek burada çok basit, ama umarım istediğimi elde edersiniz. –

+0

@MalteHartwig teşekkürler! evet 3 puan aldım ama 'map' ile düzleştirmeyi soruyordum, başka bir işleme adımı yok mu? Ben 2 yöntemi karşılaştırmak için çalışacağız :) – TecHunter

0

Yukarıdaki yanıtlar, yeni bir akış nesnesini hatalı konumlandırmanı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))) { 
    ... 
} 
İlgili konular