浅海 智晴(あさみ ともはる)
 最近はすっかりScalaプログラマ。代表作はXML SmartDoc(XML文書処理システム),Relaxer(XML/Javaスキーマコンパイラ)。現在はScala DSLモデルコンパイラSimpleModelerを開発中。近著は「上流工程UMLモデリング」(日経BP),「マインドマップではじめるモデリング講座」(翔泳社)。モデル駆動開発×クラウド・コンピューティングの研究プロジェクトedge2.cc(Edge to Cloud Computing)を中心に活動中。

4 その他

 Scalaプログラミングで特に重要と思われる文字列処理とコレクション・ライブラリのプログラミング作法について説明しました。今回は,その他の重要な項目について簡単に説明していきます。

4.1 for文

 Scalaのfor文は,一見Javaのfor文と良く似ていますが,その内容は全く異なっています。もちろん,Javaのfor文的な使い方もできるのですが,もっと高機能であり拡張性も高くなっています。

 for文の説明の準備として,以下の定義を行います。ケース・クラスとして,国と都市を定義し,簡単なデータを入れました。ケース・クラス国は国の名前と首都,ケースクラス都市は都市名,国名,人口の情報を持ちます。変数国一覧には国情報のリストを,都市一覧には都市情報のリストを定義しました。

case class 国(val 名前: Symbol, val 首都: Symbol)
case class 都市(val 名前: Symbol, val 国名: Symbol, val 人口: Long)
val 国一覧 = List(国('日本, '東京), 国('米国, 'ワシントン), 国('英国, 'ロンドン))
val 都市一覧 = List(都市('東京, '日本, 31112000), 都市('阪神, '日本, 15067000), 都市('ニューヨーク, \
    '米国, 27860000), 都市('ワシントン, '米国, 6474000), 都市('ロンドン, '英国, 9332000), \
    都市('マンチェスター, '英国, 3851000))

 クラスNationのListである国一覧へのアクセスは以下のようになります。

    for (nation <- 国一覧) {
      println("国 = %s, 首都 = %s".format(nation.名前, nation.首都))
    }

 実行結果は以下の通りです。これは一般的なfor文ですね。

国 = '日本, 首都 = '東京
国 = '米国, 首都 = 'ワシントン
国 = '英国, 首都 = 'ロンドン

 Scalaのfor文の真骨頂はfor yield文によるコレクションの生成にあります。以下の例では,クラス国のListである国一覧から,国名と首都の対のTupleのListを生成します。

>val nationCapitalPairs = for (nation <- 国一覧) yield (nation.名前, nation.首都)
println(nationCapitalPairs)

 実行結果は以下の通りです。この例からわかる通りfor yield文は生成したコレクションを返すので,これを変数に格納して使用することができます。

List(('日本,'東京), ('米国,'ワシントン), ('英国,'ロンドン))