2017-01-07 6 views
0

Lambdasで次の週のタスクを取得しました。 コントロールフローステートメントのないラムダを書くべきです。

例:
文字列があり、この文字列はn回繰り返す必要があります。 例:(string、3) - > stringstringstring。 一般的な問題は、わからないことです。 -9または0 私のコードは次のようになります。制御フローステートメントのないラムダ

BiFunction<Integer, String, String> nAnhaengen 
    = (n, word) -> { 
    Stream.iterate(word, wordAdd-> word + wordAdd). 
    limit(n). 
    skip(n-1).   
    forEach(element -> System.out.println(element)); 
    return ""; 
}; 

は、我々は負の整数をキャッチすることができますどのように、あなたのアイデアやティップスをお持ちですか?

ダニエル

+2

http://stackoverflow.com/a/24946101/1743880に間違いがありますか? – Tunaki

+0

@ Tunaki私たちは異なるパラメータでラムダを使用しなければなりません。 :/ – DanielFGA

+1

@DanielFGA '(n、word) - > String.join(" "、Collections.nCopies(n、word))'は動作しませんでしたか? – Moira

答えて

1

IntStreamを使用できます。

int n = -1; 
String word = "string"; 

String string = IntStream.range(0, n).mapToObj(a -> word).reduce(String::concat).orElse(""); 
System.out.println(string); 

OR

指定された値が0

string = Stream.iterate(word, a -> a).limit(Math.max(0, n)).reduce(String::concat).orElse(""); 
System.out.println(string); 

編集よりも低い場合は0に制限があるためにあなたのコードを変更し

:@Tunakiのように、foreachのとのStringBuilderを使用して を示唆したように
String :: concatは多くの不必要な不変な文字列を作成させます。

String string = IntStream.range(0, n).mapToObj(a -> word).collect(Collectors.joining()) 
System.out.println(string); 
+1

'.reduce(String :: concat)'は非常に遅く、不変な文字列を連結しているので、たくさんの文字列の新しいインスタンスが作成されます。この特定の例は、ドキュメント自体で参照されています。https://docs.oracle.com/javase/8/docs/api/java/util/stream/package-summary.html#MutableReduction – Tunaki

+1

@ Tunaki提案をありがとう:)編集済みStringBuilderを使用するための答え。 –

+1

'forEach'なしでこれを行う適切な方法があります。前のコメントのリンクされたドキュメントと' collect'の使用を参照してください。これはストリームが問題なしで並行して実行できることを保証します(ここでは 'forEach'で遭遇するでしょう)。 – Tunaki

関連する問題