第2回Android勉強会でAndroid & Scala
という訳で、第2回Android勉強会@金沢支部で、一部の方に非常に注目されているAndroid & Scalaの話をしてきた。こんな事やってる人は、全世界合わせても100名いないはず。先駆者になるチャンス。
金沢は遠すぎて参加できなかったよ、という方の為に、発表内容+アルファで再現してみる。
Scalaについて
オブジェクト指向型言語と関数型言語のいいとこ取り。
釈迦に説法になりそうなのでこれ以上の解説はパス。参照:Scala – Wikipedia
開発環境
- 今回はAndroid SDK 1.1 + antでターミナルより開発
- Build.xmlをscalacに対応させて対応している(参考:chris blogs: Programming for Android with Scala)
- Android SDK 1.5では、Add-onを開発する必要があるらしい(参考:Scala with Android 1.5 – Android Developers | Google グループ
- 今回はscala-2.7.4.finalを使用
開発手順
今回初めてScalaを使用するので
- Javaにて作成、デバッグ、実行
- Scalaに移植
という順序で開発を行った。
動作するアプリケーションを作ってきたよ
あるサイトのRSSを解析して、リンク先を表示するアプリケーション
Scala版のファイルサイズがやたらデカいのは、Scalaのライブラリもアーカイブしてある為。 HatebuReaderというアプリ名をつけながら参照先はITMediaだったりする。 はてブのホッテントリーを取得する予定だったのだが、Androidで動作させるとXMLを解析するところで例外を吐くので断念。解決方法があると思うのだが時間切れにより終了。PCなら動くんだけどなあ。
Scalaの強み、その1 クラス定義
Javaだとこう書くところが
public class BlogEntry { private String title; private String link; public String getLink() { return link; } public String getTitle() { return title; } public BlogEntry(String _title, String _link) { title = _title; link = _link; } @Override public String toString() { return title; } }
Scalaだとこうなる
class BlogEntry(_title: String, _link: String) { val title = _title val link = _link override def toString():String = return title }
すっきり見やすい。
Scalaの強み、その2 XML解析
「Javaがあるところ、影にXML有り」と言われるほど、JavaではXMLが頻繁に登場する。そんなXMLの扱いもかなりお手軽。
Javaだとこう書くところが
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder db = dbf.newDocumentBuilder(); Document dom = db.parse(in); Element docEle = dom.getDocumentElement(); blogEntries.clear(); NodeList nl = docEle.getElementsByTagName("item"); if (nl != null && nl.getLength() > 0) { for (int i = 0; i < nl.getLength(); i++) { Element entry = (Element) nl.item(i); Element title = (Element) entry.getElementsByTagName("title").item(0); Element link = (Element) entry.getElementsByTagName("link").item(0); String details = title.getFirstChild().getNodeValue(); String linkString = link.getFirstChild().getNodeValue(); BlogEntry entry_ = new BlogEntry(details, linkString); addNewEntry(entry_); } }
Scalaだとこうなる
val cpa = scala.xml.parsing.ConstructingParser.fromSource(src, false) val ele = cpa.document().docElem blogEntries.clear() ele match { case <rdf:RDF>{therms @ _*}</rdf:RDF> => for (therm @ <item>{_*}</item> <- therms) { var title = (therm \ "title").text var link = (therm \ "link").text val entry_ = new BlogEntry(title, link) addNewEntry(entry_) } }
こっちの方がすっきりして見やすいでしょ。RubyのHpricotを彷彿させる。
開発してみて
- Javaコードをそのまま移植する程度なら、学習コストはさほど高くない。Java & LL(Perl, Python,Ruby)を知っている人なら、なおさら。
- 現状AndroidでScalaを利用する際は、Scalaで作成したライブラリをJavaからコールする方法がスマートではないかと
- 手軽に高速なコードを書くには丁度いい。あとは開発環境が充実してくれれば言うことないのだが。
どこでもお話しますよ
こんな要望があるか不明だけと、Androidの話を聞きたいという依頼があれば引き受けます。詳細については応談なので demuyan at cnu dot jp までメール下さい。
| Programming in Scala: A Comprehensive Step-by-step Guide | |
![]() | Martin Odersky おすすめ平均 ![]() Scalaという新しい視点 開発者本人によるScala入門Amazonで詳しく見る by G-Tools |
補足(2009/8/23)
Android SDK 1.5 でもビルドできる事が後に判明。
- (android-sdkのフォルダ)/tools以下をすべてを (android-sdkのフォルダ)/platforms/android-1.5/toolsにコピー
(android-sdkのフォルダ)/platforms/android-1.5/toolsにPATHを通す
HatebuReader.zip内のdefault.propertiesを開き、sdk-folderを、 (android-sdkのフォルダ)/platforms/android-1.5/ と指定する。
これでコンパイルできる。
こちらもあわせてどうぞ
- 第1回Android勉強会@金沢支部に参加してきた
- Flickrでの画像検索
- アプリから開発者へ例外発生を通知する方法
- .Net FrameworkでScalaを試す
- iPhoneとAndroidのアプリ開発環境比較
Comments
コメントをどうぞ...



Scalaという新しい視点
開発者本人によるScala入門