早速id:kmizushimaさんが添削してくださいました

object StringDump{
  def main(args: Array[String])={
    println(dump(args(0)))
  }
  def dump(str:String):String={
    val buf = new StringBuffer
    buf append "\""
    str.getBytes("UTF-8").foreach{
      case 34 => buf append "\\\""
      case 92 => buf append "\\\\"
      case n if 32 <= n && n <= 126 => buf append(new String(Array[Byte](n)))
      case n if n < 0 => buf append ("\\%03o" format (256+n))
      case n => buf append ("\\%03o" format n)
    }
    buf append "\""
    new String(buf)
  }
}

foreachの中でいきなりcaseを書いているあたりと、
appendを使って、.() を省略しているところ、
caseのあとにifで条件を書いて、その後に関数を書いているところが違いますね。
本当は case 34 => buf.append("\\\"")を
case 34 => buf append "\\\""と書けてしまう。
Bufferでまとめて、最後にStringにするところもJava流なのかな。
私は慣れないけど、JavaでStringを連結しようとすると
大分うんざりするので、StringBufferを使うのが正解なんでしょうね。