JavaからScalaに移ったときに(微妙に)はまった点

ようやくScalaEclipseプラグインがまともに動くようになったので、順次Scalaで書くように移行訓練中です。その中で微妙にはまったり悩んだりした点など。

配列のインデックス

ほかの多くの言語とは違い、配列のインデックスはで囲うのでは無く、()で囲います。
配列使っている行でエラー表示されているときは、大体このエラーでした。identifierが
指定されていないというエラーメッセージが出てくるので、結構原因に悩みました。
(
をコンパイラは型指定子と判断している)

配列、List、Map、Setの初期化

Javaとは違いScalaではこれらコレクションの初期化にnewは使いません。
配列はval a = Array()と書きますし、List、Map、Setも同様にList()、
Map()、Set()と書いて初期化します。

要素の追加ってどうすんの?

コレクション見るとaddメソッドが無くてどうしたもんかと悩みました。
コレクションに対する要素の追加は+=演算子で行います。
Set[Int]に対する要素の追加は例えば、

import collection.mutable._
val set = Set(1,2)
set += 3

の様に行います。この例ではmutableなCollectionを使っていることに注意。
ちなみに+演算子は要素を追加した新しいコレクションを返す、破壊的代入
を行わないものです。

addAllどこ?

コレクションでよく使うメソッドである、addAllメソッドも見当たりません。
これは++=演算子で行います。

import collection.mutable._
val set = Set(1,2)
set ++= Set(3,4)
    1. 演算子は+演算子と同じく破壊的代入を行いません。

map.entrySet()が無い

どーすんねん、keysはあるからmap(key)と書いてvalue取得すんのか?
とか思ってましたが、当然同じことは別のメソッドでできます。
toIterableを使えばよいのです。

val map = Map(1 -> 2, 2-> 3)
for (val x <- map.toIterable) {
  println(x._1 + ":" + x._2)
}

条件演算子は?

直接の条件演算子Scalaにはありません。しかし、Scala
ではifが文では無く式で値を返しますので実は以下のように
書けてしまいます。(恐ろしいことに)

val it = if (true) 3 else 4

breakは?

コップ本やら何やらではScalaにはbreakもcontinueも無いとあります。
これはJava風のループ処理をやるにはかなり面倒な問題です。
と、思っていたらScala2.8になってbreak入りました。9/4のScala座で
知りました。感謝感謝。コード例は以下の通り。

import util.control.Breaks.{break, breakable}
var a = 0
breakable {
  while (true) {
    a += 1
    if (a > 9) break
  }
}

で、continueはどうやるのかというと
Scala2.8にも入ってません。ifで何とかしろとのことです。(ま、確かにね

しめ

どうか、JavaからScalaに移行する人の手助けになりますように。(AA略