J'essaie de vérifier si une chaîne de caractères Java n'est pas null
pas vide et pas un espace blanc.
À mon avis, ce code aurait dû être tout à fait à la hauteur de la tâche.
public static boolean isEmpty(String s) {
if ((s != null) && (s.trim().length() > 0))
return false;
else
return true;
}
Selon la documentation, String.trim()
devrait fonctionner ainsi :
Renvoie une copie de la chaîne de caractères, en omettant les espaces en tête et en fin de chaîne.
Si cela
String
représente une séquence de caractères vide, ou les premier et dernier caractères de la séquence de caractères représentée par l'objetString
Les deux objets ont des codes supérieurs à'\u0020'
(le caractère espace), puis une référence à cetteString
est renvoyé.
Cependant, apache/commons/lang/StringUtils.java
le fait un peu différemment.
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;
}
Selon la documentation, Character.isWhitespace()
:
Détermine si le caractère spécifié est un espace blanc selon Java. Un caractère est un caractère d'espace blanc Java si et seulement s'il répond à l'un des critères suivants :
- Il s'agit d'un caractère d'espacement Unicode (
SPACE_SEPARATOR
,LINE_SEPARATOR
ouPARAGRAPH_SEPARATOR
) mais n'est pas également un espace non cassant ('\u00A0'
,'\u2007'
,'\u202F'
).- Il est
'\t'
, U+0009 TABULATION HORIZONTALE.- Il est
'\n'
, U+000A SAUT DE LIGNE.- Il est
'\u000B'
, U+000B TABULATION VERTICALE.- Il est
'\f'
, U+000C FORM FEED.- Il est
'\r'
, U+000D RETOUR CHARIOT.- Il est
'\u001C'
, U+001C SÉPARATEUR DE FICHIERS.- Il est
'\u001D'
, U+001D SÉPARATEUR DE GROUPES.- Il est
'\u001E'
, U+001E SÉPARATEUR D'ENREGISTREMENTS.- Il est
'\u001F'
, U+001F SÉPARATEUR D'UNITÉS.
Si je ne me trompe pas - ou si je ne l'ai pas lu correctement - l'objectif de l'UE est d'améliorer la qualité de vie des citoyens. String.trim()
devrait enlever tous les caractères qui sont vérifiés par Character.isWhiteSpace()
. Tous voient qu'ils sont au-dessus de '\u0020'
.
Dans ce cas, le plus simple isEmpty
semble couvrir tous les scénarios que la fonction plus longue isBlank
couvre.
- Existe-t-il une chaîne de caractères qui rendra le
isEmpty
etisBlank
se comporte-t-il différemment dans un cas d'essai ? - En supposant qu'il n'y en ait pas, y a-t-il une autre considération pour laquelle je devrais choisir
isBlank
et ne pas utiliserisEmpty
?
Pour ceux qui souhaitent exécuter un test, voici les méthodes et les tests unitaires.
public class StringUtil {
public static boolean isEmpty(String s) {
if ((s != null) && (s.trim().length() > 0))
return false;
else
return true;
}
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;
}
}
Et des tests unitaires
@Test
public void test() {
String s = null;
assertTrue(StringUtil.isEmpty(s)) ;
assertTrue(StringUtil.isBlank(s)) ;
s = "";
assertTrue(StringUtil.isEmpty(s)) ;
assertTrue(StringUtil.isBlank(s));
s = " ";
assertTrue(StringUtil.isEmpty(s)) ;
assertTrue(StringUtil.isBlank(s)) ;
s = " ";
assertTrue(StringUtil.isEmpty(s)) ;
assertTrue(StringUtil.isBlank(s)) ;
s = " a ";
assertTrue(StringUtil.isEmpty(s)==false) ;
assertTrue(StringUtil.isBlank(s)==false) ;
}
Mise à jour : C'était une discussion vraiment intéressante - et c'est pourquoi j'aime Stack Overflow et les gens ici. Au fait, pour en revenir à la question, nous avons obtenu :
- Un programme montrant que tous les caractères font se comporter différemment. Le code est à https://ideone.com/ELY5Wv . Merci @Dukeling.
- Une raison liée à la performance pour choisir la norme
isBlank()
. Merci @devconsole. - Une explication complète par @nhahtdh. Merci mon pote.