0

ArrayBufferすべてのオブジェクトをそれぞれのサイズに変換して既存のバッファに変換したい があります。

trait Obj {
  def size: Int
}

def copySizes(input: ArrayBuffer[Obj], output: ArrayBuffer[Int]): Unit = {
  output.clear()
  input foreach { obj =>
    output += obj.size
  }
}

scala で copySizes を記述するためのより良い慣用的な方法はありますか? 私は次のような構文について考えていました:

input.mapTo(_.size, output)
4

2 に答える 2

2

あなたは出来る

output ++= input.view.map(_.size)

無視できない追加のオーバーヘッド (実行時間の約 2 倍) がありますが、よりコンパクトです。ただし、バージョンをよりコンパクトに書くことができます。

input.foreach{ output += _.size }

なので使わない理由はあまりないと思います。

于 2013-05-21T14:42:53.893 に答える
1

出力バッファをアキュムレータとして使用し、関数本体で追加を実行して、入力バッファで左折を試みることを検討しましたか?

val output = input.foldLeft(ArrayBuffer[Int]())(_ += _.size)

@Rex Kerr が述べたように、ここでforeach行っていたものと比べてパフォーマンスが低下する可能性がありますが、これが高性能を必要とするコードであるかどうかはわかりませんでした。バッファ内のアイテムの数と、このコードがヒットする頻度に依存すると思います。アイテムの数が少ない場合、またはこれが一貫してヒットするコードではない場合は、より機能的なもの (フォールド) よりも副作用に基づくもの (foreach) の方が適している可能性があります。

一般に、Scala コードを作成するときは、その決定を下さなければならないときが来ます。私は関数の純粋さ/きれいなスカラコードを気にしますか、それともこれは最適化する必要があるものですか. 可能な限り純粋に機能的な側面にとどまるようにしてから、システムのパフォーマンス テストを行い、ホットスポットを見つけて、必要に応じて最適化します。時期尚早の最適化はすべての悪の根源です (またはそのようなもの) =)

于 2013-05-21T14:35:13.220 に答える