java - peces - filtros para peceras
¿Cómo obtener el tamaño de un flujo después de aplicar un filtro por la expresión lambda? (2)
Considere el siguiente código:
List<Locale> locales = Arrays.asList(
new Locale("en", "US"),
new Locale("ar"),
new Locale("en", "GB")
);
locales.stream().filter(l -> l.getLanguage() == "en");
¿Cómo obtengo el tamaño de los locales
ArrayList
después de aplicar el filter
, dado que locales.size()
me da el tamaño antes de aplicar el filter
?
Cuando obtiene una transmisión de la lista, no la modifica. Si desea obtener el tamaño del flujo después del filtrado, llame a count()
en él.
long sizeAfterFilter =
locales.stream().filter(l -> l.getLanguage().equals("en")).count();
Si desea obtener una nueva lista, simplemente llame a .collect(toList())
en el flujo resultante. Si no le preocupa modificar la lista en su lugar, simplemente puede usar removeIf
en la List
.
locales.removeIf(l -> !l.getLanguage().equals("en"));
Tenga en cuenta que Arrays.asList
devuelve una lista de tamaño fijo para que Arrays.asList
una excepción, pero puede envolverla en una ArrayList
o simplemente recopilar el contenido de la secuencia filtrada en una List
(resp. ArrayList
) usando Collectors.toList()
(resp. Collectors.toCollection(ArrayList::new)
).
Utilice el método count()
:
long matches = locales.stream()
.filter(l -> l.getLanguage() == "en")
.count();
Tenga en cuenta que está comparando cadenas utilizando ==
. Prefiero usar .equals()
. Mientras ==
funcionará cuando se comparan cadenas internadas, falla de lo contrario.
Para su información se puede codificar usando solo referencias de métodos:
long matches = locales.stream()
.map(Locale::getLanguage)
.filter("en"::equals)
.count();