coffee20160715165504_TP_V

以下のような空文字チェック、nullチェックのソースをよく見かける。

    //よく見かける空チェック
    if(str == null || str.equals("")){
      System.out.println(str);
    }

ソース量が増えると『チェックに抜けはないか?』や『NullPointerExceptionが発生しないか?』などの確認も面倒くさい。

ユーティリティクラスに共通メソッドを作るのもいいが、ユーティリティクラスという名のもとに、よくわからないstaticメソッドの集合体になりがち。できれば、1つでも管理するメソッドを減らしたい気分になる。

JakartaのCommonsを使って、ユーティリティクラスのわかりにくいstaticメソッド管理を減らしていこう

文字列のチェック

文字列の空チェック、nullチェック

StringUtils.isEmptyでnull、空文字のチェックができる。スペースだとfalseになるので注意。

import org.apache.commons.lang3.StringUtils;

public class StringUtilsIsEmptyTest {

  public static void main(String[] args) {
    
    //nullの場合
    System.out.println("StringUtils.isEmpty(null) = " + StringUtils.isEmpty(null));
    
    //空文字の場合
    System.out.println("StringUtils.isEmpty(\"\") = " + StringUtils.isEmpty(""));
    
    //半角スペースの場合
    System.out.println("StringUtils.isEmpty(\" \") = " + StringUtils.isEmpty(" "));
    
  }
}
実行結果
StringUtils.isEmpty(null) = true
StringUtils.isEmpty("") = true
StringUtils.isEmpty(" ") = false

文字列の半角・全角スペースを含めてチェック

入力パラメータをチェックする場合、スペースだけ入力される場合もありうる。

そんな場合は、StringUtils.isBlankメソッドを使う。

import org.apache.commons.lang3.StringUtils;


public class StringUtilsIsBlankTest {
  
  public static void main(String[] args) {
    
    //nullの場合
    System.out.println("StringUtils.isBlank(null) = " + StringUtils.isBlank(null));
    
    //空文字の場合
    System.out.println("StringUtils.isBlank(\"\") = " + StringUtils.isBlank(""));
    
    //半角スペースの場合
    System.out.println("StringUtils.isBlank(\" \") = " + StringUtils.isBlank(" "));
    
    //全角スペースの場合
    System.out.println("StringUtils.isBlank(\" \") = " + StringUtils.isBlank(" "));
    
  }
}
実行結果
StringUtils.isBlank(null) = true
StringUtils.isBlank("") = true
StringUtils.isBlank(" ") = true
StringUtils.isBlank(" ") = true

nullの置換

nullなら空文字への置換も1行でできる。第二引数で置換文字を指定することもできる。

import org.apache.commons.lang3.StringUtils;

public class StringUtilsDefaultTest {
  
  public static void main(String[] args) {
    
    //nullじゃないから置換しない
    System.out.println("StringUtils.defaultString(\"abc\") = " + StringUtils.defaultString("abc"));
    
    //nullだから空文字に置換
    System.out.println("StringUtils.defaultString(\"null\") = " + StringUtils.defaultString(null));
    
    //nullじゃないから置換しない
    System.out.println("StringUtils.defaultString(\"abc\",\"def\") = " + StringUtils.defaultString("abc","def"));
    
    //nullだから指定された文字に置換
    System.out.println("StringUtils.defaultString(null,\"def\") = " + StringUtils.defaultString(null,"def"));
  }
}
実行結果
StringUtils.defaultString("abc") = abc
StringUtils.defaultString("null") = 
StringUtils.defaultString("abc","def") = abc
StringUtils.defaultString(null,"def") = def

空文字やスペースだった場合の置換

nullだけではなく、空文字やスペースだった場合のデフォルト値も1行で置換できる。

import org.apache.commons.lang3.StringUtils;

public class StringUtilsDefaultTest {
  
  public static void main(String[] args) {
        
    //emptyだから置換
    System.out.println("StringUtils.defaultIfEmpty(\"\",\"abc\") = " + StringUtils.defaultIfEmpty("","abc"));
    
    //blankだか置換
    System.out.println("StringUtils.defaultIfBlank(\"    \",\"abc\") = " + StringUtils.defaultIfBlank("    ","abc"));
  }
}
実行結果
StringUtils.defaultIfEmpty("","abc") = abc
StringUtils.defaultIfBlank("    ","abc") = abc

文字列の比較(equals)

StringUtils.equals(equalsAny)は、 文字列比較もnullチェック不要で便利です。また「いずれかの場合」も簡単にチェックできる。ただし、NULL同士の比較もtrueになるため気を付けよう。

import org.apache.commons.lang3.StringUtils;

public class Main {

  public static void main(String[] args) throws Exception {
    
    //A同士の比較
    System.out.println("StringUtils.equals(\"A\",\"A\") = " + StringUtils.equals("A","A"));
    
    //nullとAの比較
    System.out.println("StringUtils.equals(null,\"A\") = " + StringUtils.equals(null,"A"));
    
    //NULL同士の比較
    System.out.println("StringUtils.equals(null,null) = " + StringUtils.equals(null,null));
    
    //大文字・小文字無視
    System.out.println("StringUtils.equalsIgnoreCase(\"A\",\"a\") = " + StringUtils.equalsIgnoreCase("A","a"));
    
    //いずれかと等しいかチェック
    System.out.println("StringUtils.equalsAny(\"A\",\"A\",\"B\",\"C\") = " + StringUtils.equalsAny("A","A","B","C"));
    
    //NULL同士の比較
    System.out.println("StringUtils.equalsAny(null,null,\"B\",\"C\") = " + StringUtils.equalsAny(null,null,"B","C"));
    
    //いずれかと等しいかチェック(大文字・小文字無視)
    System.out.println("StringUtils.equalsAnyIgnoreCase(\"A\",\"a\",\"b\",\"c\") = " + StringUtils.equalsAnyIgnoreCase("A","a","b","c"));
  }
}
実行結果
StringUtils.equals("A","A") = true
StringUtils.equals(null,"A") = false
StringUtils.equals(null,null) = true
StringUtils.equalsIgnoreCase("A","a") = true
StringUtils.equalsAny("A","A","B","C") = true
StringUtils.equalsAny(null,null,"B","C") = true
StringUtils.equalsAnyIgnoreCase("A","a","b","c") = true

配列チェック

配列の空チェック、Nullチェック

配列のnullやsize==0チェックもcommons langで提供されている。ArrayUtils.isEmptyでチェックしよう。

import org.apache.commons.lang3.ArrayUtils;


public class ArrayUtilsIsEmptyTest {
  
  public static void main(String[] args){
    
    String[] strs;
    
    //配列数が0
    strs = new String[]{};
    System.out.println("(strs.length == 0) : " + ArrayUtils.isEmpty(strs));
    
    //nullの場合
    strs = null;
    System.out.println("(strs == null) : " + ArrayUtils.isEmpty(strs));
    
  }

}
実行結果
(strs.length == 0) : true
(strs == null) : true

Collectionのチェック

MapやListの空チェック、nullチェック

Collectionのnullチェック、空チェックはCommons Collectionsから提供されています。CollectionUtils.isEmpty

logo
import java.util.ArrayList;
import java.util.List;

import org.apache.commons.collections.CollectionUtils;

public class CollectionUtilsIsEmptyTest {

  public static void main(String[] args) {
    
    List<?> list;

    //要素数が0の場合
    list = new ArrayList<>();
    System.out.println("(list.size() == 0) : " + CollectionUtils.isEmpty(list));
    
    
    //nullの場合
    list = new ArrayList<>();
    System.out.println("(list == null) : " + CollectionUtils.isEmpty(list));
  }

}
実行結果
(list.size() == 0) : true
(list == null) : true

MapUtils.isEmptyメソッドのサンプル

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

import org.apache.commons.collections.MapUtils;


public class MapUtilsIsEmptyTest {
  
  public static void main(String[] args){
    
    Map<?, ?> map;
    
    //要素数が0の場合
    map = new HashMap<>();
    System.out.println("(map.size() == 0) : " + MapUtils.isEmpty(map));
    
    //nullの場合
    map = null;
    System.out.println("(map == null) : " + MapUtils.isEmpty(map));
    
  }

}
実行結果
(map.size() == 0) : true
(map == null) : true