Я просто натрапив на питання, коли використовував a List
та його stream()
метод. Хоча я знаю, як ними користуватися, я не зовсім впевнений, коли ними користуватися.
Наприклад, у мене є список, який містить різні шляхи до різних місць. Тепер я хотів би перевірити, чи містить один заданий шлях будь-який із зазначених у списку шляхів. Я хотів би повернутися на boolean
основі того, чи було виконано умову чи ні.
Це, звичайно, не є складним завданням. Але мені цікаво, чи слід використовувати потоки чи цикл для (-each).
Список
private static final List<String> EXCLUDE_PATHS = Arrays.asList(new String[]{
"my/path/one",
"my/path/two"
});
Приклад - Потік
private boolean isExcluded(String path){
return EXCLUDE_PATHS.stream()
.map(String::toLowerCase)
.filter(path::contains)
.collect(Collectors.toList())
.size() > 0;
}
Приклад - для кожного циклу
private boolean isExcluded(String path){
for (String excludePath : EXCLUDE_PATHS) {
if(path.contains(excludePath.toLowerCase())){
return true;
}
}
return false;
}
Зауважте, що path
параметр завжди малий .
Перший мій припущення полягає в тому, що підхід для кожного швидше, тому що цикл повернеться негайно, якщо умова буде виконана. Тоді як потік все ще перебиратиме всі записи списку для завершення фільтрації.
Чи правильне моє припущення? Якщо так, то чому (а точніше, коли ) я б stream()
тоді користувався?
new String[]{…}
. Просто використовуйтеArrays.asList("my/path/one", "my/path/two")
String[]
, дзвонити не потрібно Arrays.asList
. Ви можете просто передати потоковий масив за допомогою Arrays.stream(array)
. До речі, у мене взагалі є труднощі з розумінням мети isExcluded
тесту. Чи справді цікаво, чи елемент EXCLUDE_PATHS
буквально міститься десь у межах шляху? Тобто isExcluded("my/path/one/foo/bar/baz")
повернеться true
, як і isExcluded("foo/bar/baz/my/path/one/")
…
Arrays.stream
метод, дякую, що вказав на це. Дійсно, приклад, який я розмістив, здається абсолютно марним для інших, окрім мене. Я знаю про поведінку isExcluded
методу, але це дійсно просто щось, що мені потрібно для себе, таким чином, щоб відповісти на ваше запитання: так , це цікаво з причин, які я хотів би не згадувати, оскільки це не вкладалося б у сферу застосування оригінального питання.
toLowerCase
застосовується до константи, яка вже є малою? Чи не слід це застосовувати до path
аргументу?