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
を使えばいいっていうのはいいっこなし(´・ω・`)