Как проверить, не является ли строка пустой и не пустой?
public void doStuff(String str)
{
if (str != null && str != "**here I want to check the 'str' is empty or not**")
{
/* handle empty string */
}
/* ... */
}
Как проверить, не является ли строка пустой и не пустой?
public void doStuff(String str)
{
if (str != null && str != "**here I want to check the 'str' is empty or not**")
{
/* handle empty string */
}
/* ... */
}
Что насчет isEmpty()?
if(str != null && !str.isEmpty())
Обязательно используйте части &&
в этом порядке, потому что java не будет продолжать оценивать вторую часть, если первая часть &&
не удалась, таким образом гарантируя, что вы не получите исключение нулевого указателя от str.isEmpty()
если str
равно null,
Осторожно, он доступен только с 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 ) )
Мне нравится использовать Apache commons-lang для таких вещей, и особенно StringUtils служебный класс:
import org.apache.commons.lang.StringUtils;
if (StringUtils.isNotBlank(str)) {
...
}
if (StringUtils.isBlank(str)) {
...
}
Просто добавьте Android здесь:
import android.text.TextUtils;
if (!TextUtils.isEmpty(str)) {
...
}
Чтобы добавить к @BJorn и @SeanPatrickFloyd. Способ Guava для этого:
Strings.nullToEmpty(str).isEmpty();
// or
Strings.isNullOrEmpty(str);
Commons Lang более читаем время от времени, но я медленно полагался больше на Guava плюс иногда Commons Lang путается, когда дело доходит до isBlank()
(как в том, что пробегает или нет).
Версия Guava Lang isBlank
может быть:
Strings.nullToEmpty(str).trim().isEmpty()
Я скажу код, который не позволяет ""
(пустой) И null
подозрительный и потенциально ошибочный, поскольку он, вероятно, не обрабатывает все случаи, когда не разрешается null
имеет смысл (хотя для SQL я могу понять, что SQL/HQL странно о ''
).
str != null && str.length() != 0
в качестве альтернативы
str != null && !str.equals("")
или
str != null && !"".equals(str)
Примечание. Вторая проверка (первая и вторая альтернативы) предполагает, что str не является нулевым. Это нормально только потому, что первая проверка делает это (и Java не выполняет вторую проверку, если первая ложна)!
ВАЖНО: НЕ используйте == для равенства строк. == проверяет, что указатель равен, а не значение. Две строки могут быть в разных адресах памяти (два экземпляра), но имеют одинаковое значение!
Почти каждая библиотека, которую я знаю, определяет служебный класс с именем StringUtils
, StringUtil
или StringHelper
, и они обычно включают в себя метод, который вы ищете.
Мой личный фаворит - Apache Commons/Lang, где в классе StringUtils вы получаете оба
(Первая проверяет, является ли строка пустой или пустой, вторая проверяет, является ли она пустой, пустой или только пробелом)
В Spring, Wicket и многих других библиотеках есть похожие служебные классы. Если вы не используете внешние библиотеки, вы можете захотеть ввести класс StringUtils в свой собственный проект.
Обновление: прошло много лет, и в эти дни я бы рекомендовал использовать метод Guava Strings.isNullOrEmpty(string)
.
Это работает для меня:
import com.google.common.base.Strings;
if (!Strings.isNullOrEmpty(myString)) {
return myString;
}
Возвращает true, если заданная строка равна null или является пустой строкой.
Рассмотрим нормализацию ссылок на строку с помощью nullToEmpty. если ты do, вы можете использовать String.isEmpty() вместо этого метода, и вы не будете нужны специальные нуль-безопасные формы таких методов, как String.toUpperCase или. Или, если вы хотите нормализовать "в другом направлении", преобразование пустых строк в нуль, вы можете использовать emptyToNull.
Как насчет:
if(str!= null && str.length() != 0 )
Использовать метод isNotBlank Apache StringUtils, например
StringUtils.isNotBlank(str)
Он вернет true, только если str не является нулевым и не пуст.
Вы должны использовать org.apache.commons.lang3.StringUtils.isNotBlank()
или org.apache.commons.lang3.StringUtils.isNotEmpty
. Решение между этими двумя основано на том, что вы действительно хотите проверить.
Функция isNotBlank() проверяет, что входной параметр:
Функция isNotEmpty() проверяет только, что входной параметр
Мне стало скучно, у меня есть бесплатный рефакторинг. Это немного чище, но не первозданно.
public class ALittleCleaner {
public List<Employee> findEmployees(String str, int dep) throws ClassNotFoundException, SQLException {
log("List IN");
List<Employee> list = Lists.newArrayList();
Connection con = getConnection();
Statement stmt = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
String qry = buildQueryString(str, dep);
log(qry);
ResultSet rs = stmt.executeQuery(qry);
parseResults(list, rs);
log("List Out");
return list;
}
private void parseResults(List<Employee> list, ResultSet rs) throws SQLException {
while (rs.next()) {
Employee employee = new Employee();
String name = rs.getString(2);
employee.setName(name);
int id = rs.getInt(1);
employee.setId(id);
int dept = rs.getInt(4);
employee.setDept(dept);
int age = rs.getInt(3);
employee.setAge(age);
list.add(employee);
}
}
private String buildQueryString(String str, int dep) {
String qry = "SELECT * FROM PERSON ";
StringBuilder sb = new StringBuilder();
if (StringUtils.isNotBlank(str)) {
sb.append("WHERE NAME LIKE '%").append(str).append("%'");
log(qry);
}
if (dep != 0) {
if (sb.toString().length() > 0) {
sb.append(" AND ");
} else {
sb.append("WHERE ");
}
sb.append("dept=").append(dep);
}
qry += sb.append(";").toString();
return qry;
}
private Connection getConnection() throws SQLException, ClassNotFoundException {
Class.forName("com.mysql.jdbc.Driver");
String url = "jdbc:mysql://localhost:3306/general";
java.sql.Connection con = DriverManager.getConnection(url, "root", "1234");
log("URL: " + url);
log("Connection: " + con);
return con;
}
private void log(String out) {
// Replace me with a real logger
System.out.println(out);
}
class Employee implements Serializable {
private static final long serialVersionUID = -8857510821322850260L;
String name;
int id, dept, age;
public String getName() {
return this.name;
}
public void setName(String name) {
this.name = name;
}
public int getId() {
return this.id;
}
public void setId(int id) {
this.id = id;
}
public int getDept() {
return this.dept;
}
public void setDept(int dept) {
this.dept = dept;
}
public int getAge() {
return this.age;
}
public void setAge(int age) {
this.age = age;
}
}
}
Если вы не хотите включать всю библиотеку; просто укажите код, который вы хотите от него. Вы должны будете поддерживать это самостоятельно; но это довольно прямая функция. Здесь он копируется из commons.apache.org
/**
* <p>Checks if a String is whitespace, empty ("") or null.</p>
*
* <pre>
* StringUtils.isBlank(null) = true
* StringUtils.isBlank("") = true
* StringUtils.isBlank(" ") = true
* StringUtils.isBlank("bob") = false
* StringUtils.isBlank(" bob ") = false
* </pre>
*
* @param str the String to check, may be null
* @return <code>true</code> if the String is null, empty or whitespace
* @since 2.0
*/
public static boolean isBlank(String str) {
int strLen;
if (str == null || (strLen = str.length()) == 0) {
return true;
}
for (int i = 0; i < strLen; i++) {
if ((Character.isWhitespace(str.charAt(i)) == false)) {
return false;
}
}
return true;
}
Слишком поздно, но вот функциональный стиль проверки:
Optional.ofNullable(str)
.filter(s -> !(s.trim().isEmpty()))
.ifPresent(result -> {
// your query setup goes here
});
Возвращает true или false на основе ввода
Predicate<String> p = (s)-> ( s != null && !s.isEmpty());
p.test(string);
Если вам известна строка, которую вы хотите проверить, вы можете использовать следующие
if (!"mystring".equals(str)) {
/* your code here */
}
В java-11 есть новый метод: String#isBlank
Возвращает true, если строка пуста или содержит только пробелы, иначе false.
jshell> "".isBlank()
$7 ==> true
jshell> " ".isBlank()
$8 ==> true
jshell> " ! ".isBlank()
$9 ==> false
Это может быть объединено с Optional
чтобы проверить, является ли строка пустой или пустой
boolean isNullOrEmpty = Optional.ofNullable(str).map(String::isBlank).orElse(true);
test равен пустой строке и null в том же условии:
if(!"".equals(str) && str != null) {
// do stuff.
}
Не выбрасывает NullPointerException
, если str равно null, так как Object.equals()
возвращает false, если arg null
.
другой конструктор str.equals("")
выкинет ужасный NullPointerException
. Некоторые могут рассматривать плохую форму, используя строковый литерал, поскольку объект, на который вызывается equals()
, но выполняет эту работу.
Также проверьте этот ответ: fooobar.com/questions/18129/...
Простое решение:
private boolean stringNotEmptyOrNull(String st) {
return st != null && !st.isEmpty();
}
Как сказал seanizer выше, Apache StringUtils фантастичен для этого, если вы включили guava, вы должны сделать следующее:
public List<Employee> findEmployees(String str, int dep) {
Preconditions.checkState(StringUtils.isNotBlank(str), "Invalid input, input is blank or null");
/** code here **/
}
Могу ли я также рекомендовать, чтобы вы ссылались на столбцы в результирующем наборе по имени, а не по индексу, это упростит ваш код.
Я сделал свою собственную функцию утилиты для проверки нескольких строк сразу, вместо того, чтобы иметь оператор if, полный if(str != null && !str.isEmpty && str2 != null && !str2.isEmpty)
. Это функция:
public class StringUtils{
public static boolean areSet(String... strings)
{
for(String s : strings)
if(s == null || s.isEmpty)
return false;
return true;
}
}
поэтому я могу просто написать:
if(!StringUtils.areSet(firstName,lastName,address)
{
//do something
}
Просто небольшая хорошая практика, если не просто синтаксический сахар (поместите константу перед ==
и !=
).
if(null != str && !str.isEmpty())
Вы можете использовать StringUtils.isEmpty(), это приведет к истине, если строка является пустой или пустой.
String str1 = "";
String str2 = null;
if(StringUtils.isEmpty(str)){
System.out.println("str1 is null or empty");
}
if(StringUtils.isEmpty(str2)){
System.out.println("str2 is null or empty");
}
приведет к
str1 пустой или пустой
str2 является нулевым или пустым
Я бы посоветовал Guava или Apache Commons в соответствии с вашей реальной потребностью. Проверьте различные типы поведения в моем примере кода:
import com.google.common.base.Strings;
import org.apache.commons.lang.StringUtils;
/**
* Created by hu0983 on 2016.01.13..
*/
public class StringNotEmptyTesting {
public static void main(String[] args){
String a = " ";
String b = "";
String c=null;
System.out.println("Apache:");
if(!StringUtils.isNotBlank(a)){
System.out.println(" a is blank");
}
if(!StringUtils.isNotBlank(b)){
System.out.println(" b is blank");
}
if(!StringUtils.isNotBlank(c)){
System.out.println(" c is blank");
}
System.out.println("Google:");
if(Strings.isNullOrEmpty(Strings.emptyToNull(a))){
System.out.println(" a is NullOrEmpty");
}
if(Strings.isNullOrEmpty(b)){
System.out.println(" b is NullOrEmpty");
}
if(Strings.isNullOrEmpty(c)){
System.out.println(" c is NullOrEmpty");
}
}
}
Результат:
Apache:
a пустое
b пустое
c пустое
Google:
b - NullOrEmpty
c - NullOrEmpty
Если вы используете Java 8 и хотите иметь более функциональный подход к программированию, вы можете определить Function
которая управляет элементом управления, а затем вы можете повторно использовать его и apply()
всякий раз, когда это необходимо.
Приступая к практике, вы можете определить Function
как
Function<String, Boolean> isNotEmpty = s -> s != null && !"".equals(s)
Затем вы можете использовать его, просто называя метод apply()
следующим образом:
String emptyString = "";
isNotEmpty.apply(emptyString); // this will return false
String notEmptyString = "StackOverflow";
isNotEmpty.apply(notEmptyString); // this will return true
Если вы предпочитаете, вы можете определить Function
которая проверяет, является ли String
пустой, а затем отрицает ее !
,
В этом случае Function
будет выглядеть так:
Function<String, Boolean> isEmpty = s -> s == null || "".equals(s)
Затем вы можете использовать его, просто называя метод apply()
следующим образом:
String emptyString = "";
!isEmpty.apply(emptyString); // this will return false
String notEmptyString = "StackOverflow";
!isEmpty.apply(notEmptyString); // this will return true
С Java 8 дополнительно вы можете сделать:
public Boolean isStringCorrect(String str) {
return Optional.ofNullable(str)
.map(String::trim)
.map(string -> !str.isEmpty())
.orElse(false);
}
В этом выражении вы также будете обрабатывать String
, состоящую из пробелов.
Если вы используете Spring Boot, то нижеприведенный код сделает работу
StringUtils.hasLength(str)
Для полноты: если вы уже используете фреймворк Spring, StringUtils предоставляют метод
org.springframework.util.StringUtils.hasLength(String str)
Возвращает: true, если строка не равна null и имеет длину
, а также метод
org.springframework.util.StringUtils.hasText(String str)
Возвращает: true, если строка не равна NULL, ее длина больше 0 и она не содержит только пробелы
Просто, чтобы игнорировать и пробел:
if (str == null || str.trim().length() == 0) {
// str is empty
} else {
// str is not empty
}
Если вы используете Spring framework, вы можете использовать метод:
org.springframework.util.StringUtils.isEmpty(@Nullable Object str);
Этот метод принимает любой объект в качестве аргумента, сравнивая его с нулем и пустой строкой. Как следствие, этот метод никогда не вернет true для ненулевого объекта, отличного от String.
Лучший способ обработки нулевого значения в строке -
str!=null && !str.equalsIgnoreCase("null") && !str.isEmpty()
Вкратце,
str.length()>0 && !str.equalsIgnoreCase("null")