Con la versión de Java 8, se tiene un método que nos ayuda con las búsquedas en listas, el método filter.
De una lista de nombres, obtener aquellos que inician con la letra N. Si no hay resultados, la lista de retorno será vacía. Utilicemos la forma tradicional primero:
1 2 3 4 5 6 | final List<String> startsWithN = new ArrayList<String>(); for(String name : friends) { if(name.startsWith("N")) { startsWithN.add(name); } } |
Primero creamos una variable la cual iniciamos como una lista vacía. Luego recorremos la colección buscando por los nombres que inician con N. Si hay, agregamos el valor a la lista.
Escribamos nuevamente el código utilizando el método filter, y observemos como cambia el mismo:
1 2 3 4 | final List<String> startsWithN = friends.stream() .filter(name -> name.startsWith("N")) .collect(Collectors.toList()); |
El método filter espera una expresión Lambda que devuelve un resultado booleano. Si la expresión Lambda retorna verdadero, el elemento producto de esto se agrega a al listado resultado, caso contrario no hace nada. Finalmente el método retorna un Stream con sólo los elementos en donde la expresión lambda fue verdadero. Luego se convierte este listado en un objeto List utilizando el método collect.
El método filter devuelve un listado, al igual que el método map, La diferencia entre uno y otro es que, el método map retorna un listado del mismo tamaño, el método filter no. El método filter devuelve un listado que va desde cero a un listado que tiene como máximo el tamaño del listado de entrada. Sin embargo, a diferencia del método map, el método filter da como resultado un listado que es un sub conjunto del listado inicial.