2017-03-14 2 views
2

基本的に私はこれを行うのコンパクトなラムダな方法があるかどうかを確認したいと思います:文字列にn個の文字を追加するjava lambdasの使い方は?

int n = ... 
String s = ""; 
for (int i = 0; i < n; i++) { 
    s += 'a'; 
} 

スタートは簡単ですが、その後、私は失われています:

IntStream.range(0, n). ?? 
+1

[ 'のString = StringUtils.repeat( 'A'、N);'](https://commons.apache.org /proper/commons-lang/apidocs/org/apache/commons/lang3/StringUtils.html#repeat-char-int-) –

+0

これは「文字列を繰り返す方法」の欺瞞ではありません。これは、このコードのラムダ相当物を要求します。 – Bohemian

+0

@Bohemian And [this](http://stackoverflow.com/a/27690536/438154)答えがそれを提供します。あなたと非常によく似ています。 –

答えて

2

それは非常に簡単です。

int n = 20; 
System.out.println(IntStream.range(0, n).boxed().map(i -> "a").collect(Collectors.joining())); 

プリントアウト。

aaaaaaaaaaaaaaaaaaaa 

あなたは、Integerストリームに切り替えそしてちょうどa,a,a,a,a...1,2,3,4...のあなたのストリームを変換し、最終的にそれらを結合します"a"文字列に各番号をマップするためにboxed()を行う必要があります。

5

これは良いです:

このため、ストリーム/ラムダを使用する理由
String s = Stream.generate(() -> "a").limit(n).collect(Collectors.joining()); 
+0

true、これははるかにスマートです –

+0

'' Stream.generate( "a" :: toString) 'を使ってラムダを取り除くこともでき、これを純粋な非ラムダストリームソリューション。質問は具体的には* lambdaバージョンのコードを要求していますが、私はそれが "typo"である可能性があり、OPは実際に* Stream *バージョンを望んでいると仮定します。 – Andreas

0

?効率が悪い。

あなたはワンライナーをしたい場合は、代わりにこれを試してみてください。

String s = new String(new char[n]).replace('\0', 'a'); 
+0

さて、確かにプロファイルする必要があります - あなたが間違いなく適切な 'n'の値については、このアプローチは3つの配列' n'を作成します(そのうち2つは非常に短命です - 最適化によって)? – Hulk

+0

もう1つの方法は、[Arrays.fill()](https://docs.oracle.com/javase/8/docs/api/java/util/Arrays.html#fill)で配列を埋めることです文字列コンストラクタに渡す前に-char:A-char-)を使用すると、1つのコピーを避けることができます。 – Hulk

+0

@Hulk True、 'Arrays.fill()'は、これが本当に最良の方法なので、私が通常使うものですが、あなたは1ライナーを探しているようです。 – Andreas

関連する問題