Me encontré con una pregunta al usar un List
y su stream()
método. Si bien sé cómo usarlos, no estoy muy seguro de cuándo usarlos.
Por ejemplo, tengo una lista que contiene varias rutas a diferentes ubicaciones. Ahora, me gustaría comprobar si una única ruta determinada contiene alguna de las rutas especificadas en la lista. Me gustaría devolver un en boolean
función de si se cumplió o no la condición.
Esto, por supuesto, no es una tarea difícil en sí misma. Pero me pregunto si debería usar streams o un bucle for (-each).
La lista
private static final List<String> EXCLUDE_PATHS = Arrays.asList(new String[]{
"my/path/one",
"my/path/two"
});
Ejemplo: Stream
private boolean isExcluded(String path){
return EXCLUDE_PATHS.stream()
.map(String::toLowerCase)
.filter(path::contains)
.collect(Collectors.toList())
.size() > 0;
}
Ejemplo: bucle para cada uno
private boolean isExcluded(String path){
for (String excludePath : EXCLUDE_PATHS) {
if(path.contains(excludePath.toLowerCase())){
return true;
}
}
return false;
}
Tenga en cuenta que el path
parámetro siempre está en minúsculas .
Mi primera suposición es que el enfoque para cada uno es más rápido, porque el ciclo volvería inmediatamente, si se cumple la condición. Mientras que la secuencia seguiría recorriendo todas las entradas de la lista para completar el filtrado.
¿Es correcta mi suposición? Si es así, ¿ por qué (o más bien cuándo ) usaría stream()
entonces?
new String[]{…}
aquí. Solo useArrays.asList("my/path/one", "my/path/two")
String[]
, no es necesario llamar Arrays.asList
. Puede simplemente transmitir sobre la matriz usando Arrays.stream(array)
. Por cierto, tengo dificultades para comprender isExcluded
por completo el propósito de la prueba. ¿Es realmente interesante si un elemento de EXCLUDE_PATHS
está literalmente contenido en algún lugar dentro de la ruta? Es decir isExcluded("my/path/one/foo/bar/baz")
, volveré true
, así como isExcluded("foo/bar/baz/my/path/one/")
…
Arrays.stream
método, gracias por señalarlo. De hecho, el ejemplo que publiqué parece bastante inútil para cualquier otra persona además de mí. Soy consciente del comportamiento del isExcluded
método, pero en realidad es algo que necesito para mí, por lo tanto, para responder a su pregunta: sí , es interesante por razones que me gustaría no mencionar, ya que no encajaría en el alcance. de la pregunta original.
toLowerCase
aplica a la constante que ya es minúscula? ¿No debería aplicarse al path
argumento?