Ho appena trovato una domanda durante l'utilizzo di a List
e il suo stream()
metodo. Anche se so come usarli, non sono abbastanza sicuro di quando usarli.
Ad esempio, ho un elenco, contenente vari percorsi verso posizioni diverse. Ora, vorrei verificare se un singolo percorso specificato contiene uno dei percorsi specificati nell'elenco. Vorrei restituire un in boolean
base al fatto che la condizione sia stata soddisfatta o meno.
Questo ovviamente non è un compito difficile di per sé. Ma mi chiedo se dovrei usare flussi o un ciclo for (-each).
La lista
private static final List<String> EXCLUDE_PATHS = Arrays.asList(new String[]{
"my/path/one",
"my/path/two"
});
Esempio: Stream
private boolean isExcluded(String path){
return EXCLUDE_PATHS.stream()
.map(String::toLowerCase)
.filter(path::contains)
.collect(Collectors.toList())
.size() > 0;
}
Esempio: ciclo For-Each
private boolean isExcluded(String path){
for (String excludePath : EXCLUDE_PATHS) {
if(path.contains(excludePath.toLowerCase())){
return true;
}
}
return false;
}
Notare che il path
parametro è sempre minuscolo .
La mia prima ipotesi è che l'approccio for-each sia più veloce, perché il ciclo tornerebbe immediatamente, se la condizione è soddisfatta. Mentre il flusso continua a scorrere tutte le voci dell'elenco per completare il filtraggio.
La mia ipotesi è corretta? Se è così, perché (o meglio quando ) dovrei usare stream()
allora?
new String[]{…}
qui. Basta usareArrays.asList("my/path/one", "my/path/two")
String[]
, non è necessario chiamare Arrays.asList
. Puoi semplicemente eseguire lo streaming sull'array usando Arrays.stream(array)
. A proposito, ho difficoltà a capire del tutto lo scopo del isExcluded
test. È davvero interessante se un elemento di EXCLUDE_PATHS
è contenuto letteralmente da qualche parte all'interno di path? Cioè isExcluded("my/path/one/foo/bar/baz")
torneremo true
, così come isExcluded("foo/bar/baz/my/path/one/")
...
Arrays.stream
metodo, grazie per averlo fatto notare. In effetti, l'esempio che ho postato sembra abbastanza inutile per chiunque altro oltre a me. Sono consapevole del comportamento del isExcluded
metodo, ma in realtà è solo qualcosa di cui ho bisogno per me stesso, quindi, per rispondere alla tua domanda: sì , è interessante per ragioni che vorrei non menzionare, in quanto non rientrerebbe nello scopo della domanda originale.
toLowerCase
applicata alla costante che è già minuscola? Non dovrebbe essere applicato path
all'argomento?