Acabei de me deparar com uma dúvida ao usar um List
e seu stream()
método. Embora eu saiba como usá-los, não tenho certeza sobre quando usá-los.
Por exemplo, tenho uma lista contendo vários caminhos para locais diferentes. Agora, gostaria de verificar se um único caminho determinado contém algum dos caminhos especificados na lista. Eu gostaria de retornar um com boolean
base no fato de a condição ter sido atendida ou não.
Isso, claro, não é uma tarefa difícil em si. Mas eu me pergunto se devo usar streams ou um loop for (-each).
A lista
private static final List<String> EXCLUDE_PATHS = Arrays.asList(new String[]{
"my/path/one",
"my/path/two"
});
Exemplo - Stream
private boolean isExcluded(String path){
return EXCLUDE_PATHS.stream()
.map(String::toLowerCase)
.filter(path::contains)
.collect(Collectors.toList())
.size() > 0;
}
Exemplo - For-Each Loop
private boolean isExcluded(String path){
for (String excludePath : EXCLUDE_PATHS) {
if(path.contains(excludePath.toLowerCase())){
return true;
}
}
return false;
}
Observe que o path
parâmetro está sempre em minúsculas .
Meu primeiro palpite é que a abordagem para cada é mais rápida, porque o loop retornaria imediatamente, se a condição fosse atendida. Ao passo que o fluxo ainda faria um loop em todas as entradas da lista para concluir a filtragem.
Minha suposição está correta? Se sim, por que (ou melhor, quando ) eu usaria stream()
então?
new String[]{…}
aqui. Basta usarArrays.asList("my/path/one", "my/path/two")
String[]
, não há necessidade de ligar Arrays.asList
. Você pode simplesmente transmitir sobre a matriz usando Arrays.stream(array)
. A propósito, tenho dificuldade em entender o propósito do isExcluded
teste como um todo. É realmente interessante se um elemento de EXCLUDE_PATHS
está literalmente contido em algum lugar do caminho? Ou seja, isExcluded("my/path/one/foo/bar/baz")
vai voltar true
, assim como isExcluded("foo/bar/baz/my/path/one/")
...
Arrays.stream
método, obrigado por apontar isso. Na verdade, o exemplo que postei parece bastante inútil para qualquer outra pessoa além de mim. Estou ciente do comportamento do isExcluded
método, mas na verdade é apenas algo de que preciso para mim, portanto, para responder à sua pergunta: sim , é interessante por motivos que gostaria de não mencionar, pois não caberia no escopo da pergunta original.
toLowerCase
aplicado à constante que já está em minúsculas? Não deveria ser aplicado ao path
argumento?