怠惰系エンジニアのメモ帳

勉強した内容をメモしていきます。解説ブログではないので悪しからず。

RandomStringGeneratorでランダムな文字列を生成する

commons-textRandomStringGenerator を使用してランダムな文字列を生成してみた。
というのも、commons-langRandomStringUtils が非推奨になったらしい。

RandomStringUtils (Apache Commons Lang 3.6 API)

確かに @Deprecated ついてる。

使い方

今回は半角英数のみで、15文字のランダムな文字列を生成することを目標にする。

import org.apache.commons.text.RandomStringGenerator;

public class Main {

    public static void main(String[] args) {

        for(int i = 1; i <= 10; i++){
            System.out.printf("%02d回目;%s%n", i, generateRandomString(15));
        }

    }

    // ランダムな文字列を生成する
    public static String generateRandomString(final int length) {
        return new RandomStringGenerator.Builder()          // ビルダーを生成
                .withinRange('0', 'z')                      // 生成する文字の範囲を指定
                .filteredBy(Character::isLetterOrDigit)     // 生成される文字を抽出する条件を指定
                .build()                                    // RandomStringGenerator をインスタンス化
                .generate(length);                          // 指定した長さの文字列を取得
    }

}

ビルダーパターンや。
結果

01回目;P04ceP8ZVZbNpZG
02回目;ZijxWRc0vM2kVBR
03回目;HyIloW8PZIq95fQ
04回目;d1RM1PeZ3wyofJH
05回目;tCALG28Gmm6TIhN
06回目;cujJSQ5IHcy7qwW
07回目;uWDEFwg8aoo0jlf
08回目;WVQHbT1Mh7ISMGN
09回目;FYpc5hQIzUV9RtJ
10回目;vCfPe5kyqPJVmtw

ちゃんと半角英数のみで生成されている。

また、filteredBy の引数は CharacterPredicate の可変長引数になっているため、 任意の数の抽出条件を指定することができる。

public interface CharacterPredicate {
    boolean test(int codePoint);
}

org.apache.commons.text.CharacterPredicates に、 アルファベットを抽出する LETTERS と数字を抽出する DIGITS が定義されているので、 それを使用するのも手。(内部的には Character#isLetterCharacter#isDigit が使用されているだけ)

new RandomStringGenerator.Builder()
    .withinRange('0', 'z')
    .filteredBy(CharacterPredicates.LETTERS, CharacterPredicates.DIGITS)
    .build()
    .generate(20);

個人的には Character#isLetterCharacter#isDigit をメソッド参照で渡す方が良いのかなと思った。

RandomStringUtils 使ったことなかったので、使い勝手の比較はできないが、 API見る限りだと RandomStringUtils の方が使いやすそうではある。
なんで非推奨になったのか...。