Другой подход заключается в том, чтобы вместо этого использовать Perl Regexp :: Optimizer [GG] Дэн Когай.
use Regexp::Optimizer;
my $o = Regexp::Optimizer->new->optimize(qr/foobar|fooxar|foozap/);
# $re is now qr/foo(?:[bx]ar|zap)/
.. сначала оптимизируйте и затем отбросьте все избыточные шаблоны.
Возможно, еще более полезно помочь Ron Savage's Regexp :: Assemble . Он позволяет собирать произвольное количество регулярных выражений в одно регулярное выражение, которое соответствует всем, что соответствует отдельным RE. * Или комбинация обоих.
* Однако вам нужно знать некоторые различия между Perl и Java или другие PCRE-ароматы.
А как насчет isEmpty() ?
if(str != null && !str.isEmpty())
Обязательно используйте части &&
в этом порядке, потому что java не продолжит оценку второй части, если первая часть &&
не удалась. получить исключение нулевого указателя из str.isEmpty()
, если str
равно нулю.
Осторожно, он доступен только начиная с Java SE 1.6. Вы должны проверить str.length() == 0
в предыдущих версиях.
Чтобы игнорировать пробелы:
if(str != null && !str.trim().isEmpty())
(поскольку Java 11 str.trim().isEmpty()
можно сократить до str.isBlank()
, который также будет проверять для других пробелов Unicode)
Обернутый в удобную функцию:
public static boolean empty( final String s ) {
// Null-safe, short-circuit evaluation.
return s == null || s.trim().isEmpty();
}
Преобразуется:
if( !empty( str ) )
str != null && str.length() != 0
альтернативно
str != null && !str.equals("")
или
str != null && !"".equals(str)
Примечание. Вторая проверка (первая и вторая альтернативы) предполагает, что str не равно нулю. Это нормально только потому, что первая проверка делает это (а Java не делает вторую проверку, если первая ложна)!
ВАЖНО: НЕ используйте == для равенства строк. == проверяет равенство указателя, а не значения. Две строки могут находиться в разных адресах памяти (два экземпляра), но иметь одно и то же значение!
Мне нравится использовать Apache commons-lang для таких вещей, и особенно утилиту StringUtils class:
import org.apache.commons.lang.StringUtils;
if (StringUtils.isNotBlank(str)) {
...
}
if (StringUtils.isBlank(str)) {
...
}
Как сказал выше seanizer, Apache StringUtils отлично подходит для этого, если вы хотите включить гуаву, вы должны сделать следующее;
public List<Employee> findEmployees(String str, int dep) {
Preconditions.checkState(StringUtils.isNotBlank(str), "Invalid input, input is blank or null");
/** code here **/
}
Могу ли я также порекомендовать вам ссылаться на столбцы в вашем наборе результатов по имени, а не по индексу, это значительно облегчит поддержку вашего кода.
Почти каждая известная мне библиотека определяет служебный класс с именем StringUtils
, StringUtil
или StringHelper
, и обычно они включают в себя искомый метод.
Лично мне больше всего нравится Apache Commons/Lang, где в классе StringUtils вы получаете как
(первый проверяет, является ли строка нулевой или пустой, второй проверяет, является ли строка нулевой, пустой или содержит только пробелы)
В Spring есть похожие служебные классы, Wicket и многие другие библиотеки. Если вы не используете внешние библиотеки, вы можете добавить класс StringUtils в свой собственный проект.
Обновление: прошло много лет, и в наши дни я бы рекомендовал использовать метод Guava Strings.isNullOrEmpty(string)
.