2015-03-14 11 views
15
List<Locale> locales = Arrays.asList(
    new Locale("en", "US"), 
    new Locale("ar"), 
    new Locale("en", "GB") 
); 

locales.stream().filter(l -> l.getLanguage() == "en"); 

Ora come faccio a portare la dimensione del localesArrayListdopo l'applicazionefilter, visto che locales.size() mi dà la dimensione prima applicare filter?Come ottenere dimensioni del flusso di applicazione del filtro da lambda

+0

http://stackoverflow.com/questions/513832/how-do-i-compare-strings-in-java –

risposta

25

Quando si ottiene un flusso dall'elenco, non modifica l'elenco. Se si desidera ottenere la dimensione del flusso dopo il filtraggio, si chiama count() su di esso.

long sizeAfterFilter = 
    locales.stream().filter(l -> l.getLanguage().equals("en")).count(); 

Se si desidera ottenere un nuovo elenco, basta chiamare .collect(toList()) sul flusso risultante. Se non sei preoccupato di modificare l'elenco, puoi semplicemente utilizzare removeIf su List.

locales.removeIf(l -> !l.getLanguage().equals("en")); 

Nota che Arrays.asList restituisce una lista di dimensione fissa in modo che sarà un'eccezione, ma si può avvolgerlo in un ArrayList, o semplicemente raccogliere il contenuto del flusso filtrato in un List (risp.) Utilizzando ArrayListCollectors.toList() (rispettivamente Collectors.toCollection(ArrayList::new)).

+0

thankkk ... e come ottenere il primo? –

+0

.findFirst(). Get() –

+1

@AbdennourTOUMI Non chiamare get() incondizionatamente, non hai idea se lo stream abbia o meno elementi! Chiama uno dei metodi sicuri - oElse, oElseThrow o ifPresent. –

9

utilizzare il metodo count():

int matches = locales.stream() 
    .filter(l -> l.getLanguage() == "en") 
    .count(); 

noti che si sta confrontando stringhe utilizzando ==. Preferisci usare .equals(). Mentre == funzionerà quando si confrontano le stringhe internamente, fallisce altrimenti.


FYI può essere codificato utilizzando solo metodo riferimenti:

int matches = locales.stream() 
    .map(Locale::getLanguage) 
    .filter("en"::equals) 
    .count(); 
Problemi correlati