web-dev-qa-db-fra.com

Comment obtenir la taille d'un Stream après avoir appliqué un filtre par expression lambda?

Considérez le code suivant:

List<Locale> locales = Arrays.asList(
    new Locale("en", "US"),
    new Locale("ar"),
    new Locale("en", "GB")
); 

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

Comment obtenir la taille de localesArrayListaprès en appliquant filter, étant donné que locales.size() me donne la taille - avant appliquer filter?

29
Abdennour TOUMI

Lorsque vous obtenez un flux de la liste, il ne modifie pas la liste. Si vous souhaitez obtenir la taille du flux après le filtrage, vous appelez count() dessus.

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

Si vous voulez obtenir une nouvelle liste, appelez simplement .collect(toList()) sur le flux résultant. Si vous n'êtes pas inquiet de modifier la liste en place, vous pouvez simplement utiliser removeIf sur le List.

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

Notez que Arrays.asList Renvoie une liste de taille fixe afin de lever une exception, mais vous pouvez l'encapsuler dans un ArrayList, ou simplement collecter le contenu du flux filtré dans un List (resp. ArrayList) en utilisant Collectors.toList() (resp. Collectors.toCollection(ArrayList::new)).

43
Alexis C.

Utilisez la méthode count():

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

Notez que vous comparez des chaînes à l'aide de ==. Préférez utiliser .equals(). Bien que == Fonctionne lors de la comparaison de chaînes internes, il échoue dans le cas contraire.


Pour info, il peut être codé en utilisant uniquement des références de méthode:

long matches = locales.stream()
  .map(Locale::getLanguage)
  .filter("en"::equals)
  .count();
13
Bohemian