Właśnie natknąłem się na pytanie, kiedy używam a List
i jego stream()
metody. Chociaż wiem, jak ich używać, nie jestem pewien, kiedy ich używać.
Na przykład mam listę zawierającą różne ścieżki do różnych lokalizacji. Teraz chciałbym sprawdzić, czy pojedyncza podana ścieżka zawiera którąkolwiek ze ścieżek określonych na liście. Chciałbym zwrócićboolean
podstawie tego, czy warunek został spełniony.
Oczywiście nie jest to trudne zadanie samo w sobie. Ale zastanawiam się, czy powinienem używać strumieni, czy pętli for (-each).
Lista
private static final List<String> EXCLUDE_PATHS = Arrays.asList(new String[]{
"my/path/one",
"my/path/two"
});
Przykład - Stream
private boolean isExcluded(String path){
return EXCLUDE_PATHS.stream()
.map(String::toLowerCase)
.filter(path::contains)
.collect(Collectors.toList())
.size() > 0;
}
Przykład - pętla For-Each
private boolean isExcluded(String path){
for (String excludePath : EXCLUDE_PATHS) {
if(path.contains(excludePath.toLowerCase())){
return true;
}
}
return false;
}
Zwróć uwagę, że path
parametr jest zawsze pisany małymi literami .
Moje pierwsze przypuszczenie jest takie, że podejście for-each jest szybsze, ponieważ pętla powróci natychmiast, jeśli warunek zostanie spełniony. Podczas gdy strumień nadal będzie przechodził przez wszystkie wpisy na liście, aby zakończyć filtrowanie.
Czy moje założenie jest prawidłowe? Jeśli tak, dlaczego (a raczej kiedy ) miałbym stream()
wtedy użyć ?
new String[]{…}
. Po prostu użyjArrays.asList("my/path/one", "my/path/two")
String[]
, nie ma potrzeby dzwonić Arrays.asList
. Możesz po prostu przesyłać strumieniowo przez tablicę za pomocą Arrays.stream(array)
. Nawiasem mówiąc, mam trudności ze zrozumieniem ogólnego celu isExcluded
testu. Czy to naprawdę interesujące, czy element EXCLUDE_PATHS
jest dosłownie zawarty gdzieś na ścieżce? To znaczy isExcluded("my/path/one/foo/bar/baz")
wrócę true
, a także isExcluded("foo/bar/baz/my/path/one/")
…
Arrays.stream
metody, dzięki za wskazanie tego. Rzeczywiście, przykład, który opublikowałem, wydaje się zupełnie bezużyteczny dla nikogo poza mną. Zdaję sobie sprawę z zachowania isExcluded
metody, ale tak naprawdę jest to coś, czego dla siebie potrzebuję, więc odpowiadając na Twoje pytanie: tak , jest ciekawa z powodów, o których nie chciałbym mówić, bo nie mieściłaby się w zakresie pierwotnego pytania.
toLowerCase
stosuje się do stałej, która jest już mała? Czy nie należy go zastosować do path
argumentu?