【Java】StringUtilsのメソッドが便利だった件

# 概要
こんにちは！
本日はコードレビューで教わったJavaのtipsを書いてみます。

Javaを数年書いてるのに知らなかったので、
その念も込めた記事です笑

## StringUtilsについて
StringUtilsはString型の文字列操作で様々な操作ができるメソッドです！

レビューで教わった際もそうだったのですが、例えば
nullチェックが不要になる考慮があったりします。

公式サイト↓

https://commons.apache.org/proper/commons-lang/apidocs/org/apache/commons/lang3/StringUtils.html

### ChatGPTにも聞いてみた
文字列操作ってのは上記と同様で、「Apache Commons Lang」
というライブラリにて提供されているようですね。

:::note info
StringUtils は、一般的に 文字列操作 を行うための便利なメソッドを
提供するクラスやライブラリを指します。

特に、Javaの Apache Commons Lang ライブラリの一部として提供されている、
StringUtils クラスが広く知られています。

このクラスは文字列操作に関する多くのユーティリティメソッドを持ち、
文字列の空白チェックや部分文字列の検索・置換、文字列の逆転等、
様々な機能を提供します。
:::

## isEmpty / isNotEmpty
結論から言うと、String型のnullチェックと空チェックを
してくれます！

```StringUtils.java
public static boolean isEmpty(final CharSequence cs) {
   // null Check & empty Check!
   return cs == null || cs.length() == 0;
}
```

Stringクラスの場合は空チェックのみ実施なので、
nullチェックも兼ねてくれるため便利ですね！

```String.java
public boolean isEmpty() {
   // empty Check Only! 
   return value.length == 0;
}

```

NullPointerExceptionを防げる方法にもなりそうです！

### 使用例
```sample.java
import org.apache.commons.lang3.StringUtils;

public class StringUtilsExample {
    public static void main(String[] args) {
        String str1 = "";
        String str2 = null;
        String str3 = "Hello, World!";
        
        // str1は空文字列なのでtrueを返す
        System.out.println("Is str1 empty? " + StringUtils.isEmpty(str1));  // true
        
        // str2はnullなのでtrueを返す
        System.out.println("Is str2 empty? " + StringUtils.isEmpty(str2));  // true
        
        // str3は文字が含まれているのでfalseを返す
        System.out.println("Is str3 empty? " + StringUtils.isEmpty(str3));  // false
    }
}
```

## isBlank / isNotBlank
こちらは文字列が
- null
- 空
- または空白（スペース、タブ、改行など）

で構成されているかを判定するメソッドです！

### 使用例
isEmptyとの違いは、空白であるかを確認するところですね。
ややこしいですが、空白(スペース等)が含まれれば空文字ではないので！

```sample.java
import org.apache.commons.lang3.StringUtils;

public class Example {
    public static void main(String[] args) {
        String str = "   ";
        
        String str2 = "ab c";
        
        // isEmpty: 空文字列かどうか
        System.out.println(StringUtils.isEmpty(str)); // false
        
        // isBlank: 空白または空文字列かどうか
        System.out.println(StringUtils.isBlank(str)); // true

        // isBlank: 全て空文字でないと空白判定にはならない
        System.out.println(StringUtils.isBlank(str2)); // false
    }
}
```

## reverse
こちらはシンプルで、文字列を逆順にします。

```ReverseExample.java
import org.apache.commons.lang3.StringUtils;

public class ReverseExample {
    public static void main(String[] args) {
        String str = "abcdefg";
        
        // 文字列を逆転
        String reversedStr = StringUtils.reverse(str);
        System.out.println(reversedStr);  // "gfedcba"
    }
}

```

## contains
containsは、文字列の中に特定の部分文字列が
含まれているかをチェックします！

```ContainsExample.java
import org.apache.commons.lang3.StringUtils;

public class ContainsExample {
    public static void main(String[] args) {
        String str = "Hello, World!";
        
        // "World" が含まれているか確認
        System.out.println(StringUtils.contains(str, "World"));  // true
        
        // "Java" が含まれているか確認
        System.out.println(StringUtils.contains(str, "Java"));   // false
    }
}

```

## upperCase / lowerCase
- upperCase
  - 文字列を全て大文字に変換します
- lowerCase
  - 文字列を全て小文字に変換します

### 使用例
```UpperAndLowerCaseExample.java
import org.apache.commons.lang3.StringUtils;

public class UpperAndLowerCaseExample {
    public static void main(String[] args) {
        String str = "Hello, World!";
        
        // すべて大文字に変換
        String upperStr = StringUtils.upperCase(str);
        System.out.println(upperStr);  // "HELLO, WORLD!"

        // すべて小文字に変換
        String lowerStr = StringUtils.lowerCase(str);
        System.out.println(lowerStr);  // "hello, world!"
    }
}

```

## trim
文字列の前後の空白を削除します。

### 使用例

```TrimExample.java
import org.apache.commons.lang3.StringUtils;

public class TrimExample {
    public static void main(String[] args) {
        String str = "   Hello, World!   ";
        
        // 前後の空白を削除
        String trimmedStr = StringUtils.trim(str);
        System.out.println("Before: '" + str + "'");
        System.out.println("After: '" + trimmedStr + "'");  // "Hello, World!"
    }
}

```

## leftPad / rightPad
文字列の左または右側を、指定の文字数になるよう空白で埋めてくれます。

### 使用例
```PadExample.java
import org.apache.commons.lang3.StringUtils;

public class PadExample {
    public static void main(String[] args) {
        String str = "A";
        
        // 指定した文字数になり、空白で調整する
        System.out.println(StringUtils.leftPad(str, 5));         // 5文字で指定
        System.out.println(StringUtils.leftPad(str, 5, "1"));    // "1"で埋めて5文字にする
        System.out.println(StringUtils.rightPad(str, 3));
        System.out.println(StringUtils.rightPad(str, 5, "3"));
    }
}
```

```result.java
// 分かりにくいですが、2行目と4行目は空白で5文字になってます
    A
1111A
A   
A3333
```

## isNumeric / isNumericSpace
最後はこれ。
このメソッドは少々ややこしく、微妙な違いがあります。

- isNumeric
  - 数字かどうかチェックし、true/falseを返却
  - 空文字・nullの場合はfalse
  - スペースや小数点、符号等もfalseを返却

- isNumericSpace
  - 数字かどうか確認するのは共通
  - こちらは空白を許容する
  - それ以外は isNumeric と同じ

### 使用例
isNumericSampleは数字のみの構成しかtrueにならない。

```IsNumericExample.java
import org.apache.commons.lang3.StringUtils;

public class IsNumericExample {
    public static void main(String[] args) {
        System.out.println(StringUtils.isNumeric("12345"));  // true
        System.out.println(StringUtils.isNumeric("12 345")); // false (スペースを含むため)
        System.out.println(StringUtils.isNumeric("123.45")); // false (小数点を含むため)
        System.out.println(StringUtils.isNumeric("abc123")); // false (アルファベットを含むため)
        System.out.println(StringUtils.isNumeric(""));       // false (空文字)
    }
}
```

次に isNumericSpace の例。

isNumericSpaceは空白を許容し、例えば「12 345」でもtrueになる
```IsNumericSpaceExample.java
import org.apache.commons.lang3.StringUtils;

public class IsNumericSpaceExample {
    public static void main(String[] args) {
        System.out.println(StringUtils.isNumericSpace("12345"));   // true
        System.out.println(StringUtils.isNumericSpace("12 345"));  // true (スペースを許容)
        System.out.println(StringUtils.isNumericSpace("123.45"));  // false (小数点を含むため)
        System.out.println(StringUtils.isNumericSpace("abc123"));  // false (アルファベットを含むため)
        System.out.println(StringUtils.isNumericSpace(""));        // false (空文字)
    }
}


```

## 最後に
Java歴長い人は、当たり前に知ってるような内容かもしれません。

しかし現場のソースを見るとStringUtilsではなく、
Stringの方を使用している場合もあります。

例えばisEmptyなら、ぬるぽを防ぐために採用してみるなど
意外と活躍できる場面は近くにあるかもしれません・・・！

基本に戻って、そんなきっかけ等に役立てれば幸いです！

## 参考文献
- Stringのnull、空文字チェックにはStringUtilsのメソッドを使おう！

https://qiita.com/nashi-nashi/items/1d66e5d8dc5ffd8142a8

- StringUtils

https://commons.apache.org/proper/commons-lang/apidocs/org/apache/commons/lang3/StringUtils.html