Java String がnull
空でも空白でもないかどうかを確認しようとしています。
私の考えでは、このコードは十分に機能していたはずです。
public static boolean isEmpty(String s) {
if ((s != null) && (s.trim().length() > 0))
return false;
else
return true;
}
ドキュメントに従って、次のString.trim()
ように動作するはずです:
先頭と末尾の空白を省略して、文字列のコピーを返します。
この
String
オブジェクトが空の文字シーケンスを表す場合、またはこのオブジェクトによって表される文字シーケンスの最初と最後の文字の両方が(スペース文字)String
より大きいコードを持つ場合、このオブジェクトへの参照が返されます。'\u0020'
String
ただし、apache/commons/lang/StringUtils.java
少し異なります。
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;
}
ドキュメントによると、次のCharacter.isWhitespace()
とおりです。
Javaに従って、指定された文字が空白かどうかを判断します。次の基準のいずれかを満たす場合に限り、その文字は Java 空白文字です。
- これは Unicode スペース文字 (
SPACE_SEPARATOR
、LINE_SEPARATOR
、またはPARAGRAPH_SEPARATOR
) ですが、非改行スペース ('\u00A0'
、'\u2007'
、'\u202F'
) ではありません。'\t'
U+0009 HORIZONTAL TABULATIONです。'\n'
、U+000A LINE FEEDです。'\u000B'
、U+000B VERTICAL TABULATIONです。'\f'
、U+000C FORM FEEDです。'\r'
、U+000D CARRIAGE RETURNです。'\u001C'
、U+001C FILE SEPARATORです。'\u001D'
、U+001D GROUP SEPARATORです。'\u001E'
、U+001E RECORD SEPARATORです。'\u001F'
、U+001F UNIT SEPARATORです。
私が間違っていない場合、または正しく読んでいない可能性がある場合String.trim()
は、 によってチェックされている文字を削除する必要がありますCharacter.isWhiteSpace()
。それらはすべて上にあるように見えます'\u0020'
。
この場合、単純なisEmpty
関数は、より長い関数がカバーするすべてのシナリオをカバーしているように見えますisBlank
。
- テスト ケースで
isEmpty
との動作を変える文字列はありますか?isBlank
- 何もないと仮定すると、選択
isBlank
して使用しないための考慮事項は他にありますisEmpty
か?
実際にテストを実行することに興味がある人のために、メソッドと単体テストを次に示します。
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;
}
}
そして単体テスト
@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) ;
}
更新: とても興味深い議論でした。これが私が Stack Overflow とここにいる人々が好きな理由です。ところで、質問に戻ると、次の結果が得られました。
- どのキャラクターが異なる振る舞いをするかを示すプログラム。コードはhttps://ideone.com/ELY5Wvにあります。ありがとう@Dukeling。
- 標準を選択するパフォーマンス関連の理由
isBlank()
。@devconsole に感謝します。 - @nhahtdh による包括的な説明。ありがとう。