🕌

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

2024/09/26に公開

概要

こんにちは!
本日はコードレビューで教わった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」
というライブラリにて提供されているようですね。

isEmpty / isNotEmpty

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

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

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

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

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

使用例

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との違いは、空白であるかを確認するところですね。
ややこしいですが、空白(スペース等)が含まれれば空文字ではないので!

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

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

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は、文字列の中に特定の部分文字列が
含まれているかをチェックします!

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
    • 文字列を全て小文字に変換します

使用例

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

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

使用例

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

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

使用例

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"));
    }
}
// 分かりにくいですが、2行目と4行目は空白で5文字になってます
    A
1111A
A   
A3333

isNumeric / isNumericSpace

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

  • isNumeric

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

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

使用例

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

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になる

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

Discussion