【Java】Javaにおける値存在判定

## 1.  はじめに
　今まで、null判定・undefined判定などの値があるかどうかを判定するロジックに悩むことが多かったので、今回はメモ書きとしてまとめていたものを公開していきます。（今回はJava編です）

## 2. Javaにおける値存在判定

### ①Objects.isNull()
nullの場合にtrueを返します。
!= nullよりも可読性が高い、streamAPIのfilterなどでも使えるというメリットがあります。　

```java
    String hoge = null;
    
    // 結果：nullです
    if (Objects.isNull(hoge)) {
       System.out.print("nullです。");
    }
```

### ②String.isEmpty()
要素の文字数が0の時にtrueを返します。
但し、その要素がnullの場合はNullPointerException（通称ぬるポ）になり、エラーとなってしまいます。

```java
    String hoge = null;
    String hogehoge = "";

    // 結果：NullPointerException
    if (hoge .isEmpty()) {
       System.out.print("nullです。");
    }

    // 結果：文字数がありません。
     if (hogehoge .isEmpty()) {
       System.out.print("文字数がありません。");
    }
```

### ③（Apache版）StringUtils.isEmpty()
nullと""（空文字）の時にtrueを返します。
但しスペースのみの場合はfalseになります。
※StringUtilsクラスはSpring版もありますが、Spring版のStringUtils.isEmpty()は非推奨になっています。

```java
    String hoge = null;
    String hogehoge = "";
    String hogehogehoge = " ";

    // 結果：nullです。
    if (StringUtils.isEmpty(hoge )) {
       System.out.print("nullです。");
    }

    // 結果：空文字です。
     if (StringUtils.isEmpty(hogehoge)) {
       System.out.print("空文字です。");
    }

    // 結果：何も出力しない
     if (StringUtils.isEmpty(hogehogehoge )) {
       System.out.print("半角スペースです。");
    }
```

### ④（Apache版）StringUtils.isBlank()
Apache版のみ存在するメソッドです。
nullと""（空文字）だけでなく、スペースの時にもtrueを返します。

```java
    String hoge = null;
    String hogehoge = "";
    String hogehogehoge = " ";

    // 結果：nullです。
    if (StringUtils.isBlank(hoge )) {
       System.out.print("nullです。");
    }

    // 結果：空文字です。
     if (StringUtils.isBlank(hogehoge)) {
       System.out.print("空文字です。");
    }

    // 結果：半角スペースです。
     if (StringUtils.isBlank(hogehogehoge )) {
       System.out.print("半角スペースです。");
    }
```

### ⑤（Apache版）CollectionUtils.isEmpty()
Listがそもそもない場合（null）、Listの中身がない場合（空）両方に対しても値があるかどうかを判定してくれます。

```java
    List<String> hogeList= new ArrayList<String>();

    // 結果：空の配列です。
    if (CollectionUtils.isEmpty(hogeList)) {
       System.out.print("空の配列です。");
    }

   // 下記と同じ意味のコードです。
   if (hogeList== null || hogeList.size() == 0) {
      System.out.print("空の配列です。");
   }
```

### ⑥（Apache版・Spring版）MapUtils.isEmpty()
Mapがそもそもない場合（null）、Mapの中身がない場合（空）両方に対しても値があるかどうかを判定してくれます。

```java
　Map<String, Object> hoge = new HashMap<>();

   // 結果：空のMapです。
    if (MapUtils.isEmpty(hoge)) {
        System.out.print("空のMapです。");
    }

    // 下記と同じ意味のコードです。
    if (hoge == null || hoge.isEmpty()) {
        System.out.print("空のMapです。");
    }
```

| 引数 | 引数(コード) | Objects.isNull() | String.isEmpty()| StringUtils.isEmpty()| StringUtils.isBlank()| CollectionUtils.isEmpty()| MapUtils.isEmpty() | 
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
| null | null | **true** | エラー | **true** | **true** | **true** | **true** |
| 空文字 | ''  | **true** | **true** | **true** | **true** | - | - |
| 半角スペース | ' ' | **true** | false | false | **true** | - | - |
| 空配列 | []  | - | - | - | - | **true** | - |
| 空のMap | {} | - | - | - | - | - |  **true** |

## 3.さいごに
今回の記事は以上です。
SpringBootにおけるアノテーションで、nullチェックなどを行う場合のメソッドについても書いていきます。

## 4.参考資料
①[Stringのnull、空文字チェックにはStringUtilsのメソッドを使おう！](https://qiita.com/nashi-nashi/items/1d66e5d8dc5ffd8142a8)
②[【Java】どうしてString.isEmpty()ではなくStringUtils.isEmpty()を使うのか](https://qiita.com/mtanabe/items/fdfd304e461fd50e10ff)
③[Java 推奨されるnullチェックについて](https://qiita.com/ry-s/items/ebf5249521c00b666070)
④[MapのnullチェックにはMapUtils.isEmpty()を使おう！](https://qiita.com/nashi-nashi/items/70c5614d7059218224f9)