Java

文字列の繰り返しをシンプルに書きたい

def repeat(str, n):
    return str * n 

文字列の内容をn回だけ繰り返した新しい文字列を生成したいという場合、Pythonでは上の例のように書くことができます。つまり*演算子が文字列を繰り返す機能を有しているのですが、同様のことをJavaで実現するとなると、次のようなメソッドを定義することが多いと思います(nullチェックなどは省略)。

public static String repeat(String str, int n) {
  var sb = new StringBuilder();
  while(n-- > 0) sb.append(str);
  return sb.toString();
}

別にこれでかまわないといえばそのとおりなのですが、Pythonでは1行で書けるのにJavaでは書けないというのは悔しい(謎)。そこでJavaで文字列の繰り返しをシンプルに書く方法をよく考えるのですが、個人的にまず思いつくのがStreamを使う方法。

public static String repeat(String str, int n) {
  return IntStream.range(0, n).mapToObj(i -> str).collect(Collectors.joining(""));
}

確かに1行にはなったものの、1行にするためにややトリッキーな書き方をしている印象も受けます。よりシンプルにすべく、いろいろ調べる中で思いついたのが以下の方法。

public static String repeat(String str, int n) {
  return String.join("", Collections.nCopies(n, str));
}

より短く、よりシンプルになりました。短くするためにトリッキーなことをするという感じもありません。Collections.nCopiesがリストを生成するため、そこだけ気にしつつ、積極的に使っていきたいと思います。

Apache Commons LangのStringUtils.repeatを使えばいいっていうのはいいっこなし(´・ω・`)