11

私は現在、関数型プログラミングに慣れようとしているだけでなく、新しい言語を再び学習しようとして、Scala でいろいろなことを試しています (前回からしばらく経ちました)。

文字列のリストを 1 つの長い文字列にマージする場合 (例: "scala", "is", "fun" => "scalaisfun")、文字列のリストが与えられた場合、それを行う 1 つの方法はfoldRight、それぞれの要素に連結を実行して適用することであると考えました。もう 1 つの方法は、確かにはるかに簡単ですが、 を呼び出すことmkStringです。

私はgithubをチェックしましたが、それぞれの機能のソースコードを実際に見つけることができなかったので(それについての助けをいただければ幸いです)、機能がどのように実装されているかわかりません。頭の上では の方が柔軟だと思いますが、実装のどこかにmkStringがあるのではないかと感じています。foldRightそれに真実はありますか?

それ以外の場合、scaladocs は、それぞれの要素をmkString呼び出すことについて言及しています。toStringそれらがすでに文字列であることを確認するとmkString、この特定のケースではマイナスポイントになる可能性があります。パフォーマンス、シンプルさ/エレガンスなどに関して、両方の方法の長所と短所について何かコメントはありますか?

4

3 に答える 3

23

簡単な答え: を使用しますmkString

someString.toString 同じオブジェクトを返します。

mkString単一で実装され、StringBuilder新しい文字列を 1 つだけ作成します。新しい文字列foldLeftを作成します。N-1

StringBuilderで使用できます。foldLeftと同じくらい高速ですがmkStringmkStringより短いです。

strings.foldLeft(new StringBuilder){ (sb, s) => sb append s }.toString
strings.mkString // same result, at least the same speed
于 2013-05-08T18:39:42.477 に答える
6

foldRight本当に必要な場合以外 は使用しないでください。大規模なコレクション (一部の種類のコレクション) ではスタックがオーバーフローするためです。foldLeftorfoldは機能しますが (中間データをスタックに保存しません)、 より遅くなり、扱いにくくなりmkStringます。リストが空でない場合reducereduceLeft機能します。

于 2013-05-08T18:50:24.747 に答える
3

ImメモリはmkString、StringBuilderを使用して効率的なStringを構築します。StringBuilderScalaを へのアキュムレータとして使用して同じことを達成することもできますが、すでにそのすべての優れた機能を実行できるのfoldRightであれば、わざわざする必要mkStringはありません。PlusmkStringには、オプションの区切り文字も含めるという追加の利点があります。あなたはそれを行うことができますがfoldRight、それはすでにあなたのために行われていますmkString

于 2013-05-08T18:38:32.250 に答える