Следующий код будет делать то, что вы хотите, и меньше, чем ваш исходный код, но он запутанный и всегда обрабатывает все символы, то есть не останавливается рано, если обнаружен несбалансированный )
.
Однаков отличие от некоторых других ответов здесь, он не нарушает правила потока, поддерживая состояние вне потока.
private static boolean isBalanced(String text) {
return 0 == text.chars()
.reduce(0, (n, c) -> n < 0 ? n : c == '(' ? n + 1 : c == ')' ? n - 1 : n);
}
Логика следующая:
Сохранитьпромежуточный итог, представляющий уровень вложенности, то есть увеличьте значение, когда найдено (
, и уменьшите значение, если найдено )
.
Если общее значение опустится ниже 0, прекратите обновлениеэто, т. е. при обнаружении несбалансированного )
, итоговое итоговое значение остается равным -1.
В результате операция reduce
будет:
0
: все (
сбалансированы )
-1
: найдено несбалансированным )
>0
: найдено несбалансированным (
Длинная версия thтот же код, использующий операторы if
вместо условного троичного оператора.
private static boolean isBalanced(String text) {
int finalLevel = text.chars().reduce(0, (lvl, ch) -> {
if (lvl < 0)
return lvl; // Keep result of -1 for unbalanced ')'
if (ch == '(')
return lvl + 1;
if (ch == ')')
return lvl - 1;
return lvl;
});
return (finalLevel == 0);
}