2015-03-14 4 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"); 

Теперь, как я могу получить размер localesArrayListпосле применения filter, учитывая, что locales.size() дает мне размер перед претендует filter?Как получить размер потока после применения фильтра по лямбде

+0

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

ответ

25

Когда вы получаете поток из списка, он не изменяет список. Если вы хотите получить размер потока после фильтрации, вы вызываете на нем count().

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

Если вы хотите, чтобы получить новый список, просто позвоните .collect(toList()) на результирующем потоке. Если вас не волнует изменение списка на месте, вы можете просто использовать removeIf на List.

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

Обратите внимание, что Arrays.asList возвращает список фиксированного размера, так что будет сгенерировано исключение, но вы можете обернуть его в ArrayList, или просто собирают содержание фильтрованного потока в List (соотв. ArrayList) с использованием Collectors.toList() (соответственно Collectors.toCollection(ArrayList::new)).

+0

thankkk ... и как получить первое? –

+0

.findFirst(). Get() –

+1

@AbdennourTOUMI Не вызывайте get() безоговорочно, вы понятия не имеете, есть ли у потока элементы или нет! Вызовите один из безопасных методов - orElse, orElseThrow или ifPresent. –

9

Используйте count() метод:

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

Обратите внимание, что вы сравнения строк с использованием ==. Предпочитают использовать .equals(). В то время как == будет работать при сравнении интернированных строк, это не сработает иначе.


FYI он может быть кодированы с использованием только ссылки метод:

int matches = locales.stream() 
    .map(Locale::getLanguage) 
    .filter("en"::equals) 
    .count(); 
Смежные вопросы