2014-04-11 6 views
57

In particolare, ho TabPane e vorrei sapere se è presente un elemento con ID specifico.Come verificare se l'elemento esiste usando un'espressione lambda?

Quindi, vorrei fare questo con l'espressione lambda in Java:

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

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

risposta

138

Provare a usare anyMatch di Lambda Expression. È un approccio molto migliore.

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

Mentre la risposta accettata è corretta, aggiungerò una versione più elegante (a mio parere):

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

Non trascurare utilizzando Stream#map() che permette di appiattire la struttura dei dati prima di applicare il Predicate.

+2

cosa c'è di meglio qui? Vedo solo un'altra operazione. Scusate, sono nuovo di questa cosa di lamba. – TecHunter

+2

@TecHunter è più esplicito. Immagina di leggere questo codice la prima volta, o ancora dopo un po '. Ci sono diversi vantaggi: in primo luogo, dimostriamo immediatamente che non siamo realmente interessati alla scheda, ma a qualche mappatura di essa. Secondo, usando i riferimenti al metodo (che è possibile solo perché suddividiamo il lambda iniziale in due passaggi) mostriamo che non ci sono sorprese nascoste nel codice. Terzo, usando i riferimenti al metodo, non creiamo un nuovo Predicato, ma riutilizziamo davvero 'equals'. Però, concesso, l'esempio qui è molto semplice, ma spero che capisca cosa intendo. –

+0

@MalteHartwig grazie! Sì, ho ottenuto i tuoi 3 punti, ma stavo chiedendo l'appiattimento con 'map', si fa un altro passaggio di elaborazione no? Proverò a confrontare i 2 metodi :) – TecHunter

0

Le risposte di cui sopra richiedono di malloc un nuovo oggetto flusso.

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))) { 
    ... 
} 
Problemi correlati