Land of Lispを読んだらどうだろう。 (すみません。9割ネタです。)

Land of Lisp

Land of Lisp

  • 作者: M.D. ConradBarski,Conrad Barski,川合史朗
  • 出版社/メーカー: オライリージャパン
  • 発売日: 2013/02/23
  • メディア: 大型本
  • 購入: 1人 クリック: 18回
  • この商品を含むブログ (19件) を見る

Kotlinを初めて数ヶ月だったあなたへ

今年のGoogle I/OでKotlinがAndroidで正式サポートされるとアナウンスされた頃からでしょうか、Kotlin初心者向けの勉強会が一気に増え、実際に自分の周りもAndroidエンジニアを中心にKotlinを触る人が増えてきました。
最初はみなさんこちらの赤べこ本から始める人が多いかと思います。

Kotlinスタートブック -新しいAndroidプログラミング

Kotlinスタートブック -新しいAndroidプログラミング

  • 作者: 長澤太郎
  • 出版社/メーカー: リックテレコム
  • 発売日: 2016/07/13
  • メディア: 単行本(ソフトカバー)
  • この商品を含むブログ (1件) を見る

(英語が得意な人であればKotlin in Actionもいいですね)

Kotlin in Action

Kotlin in Action

  • 作者: Dmitry Jemerov,Svetlana Isakova
  • 出版社/メーカー: Manning Pubns Co
  • 発売日: 2017/02/19
  • メディア: ペーパーバック
  • この商品を含むブログを見る

赤ベコ本、初心者でもとっつきやすくて本当に素敵な入門書です。ただ、入門書も読み終わって初心者からそろそろもう一歩進みたいそこのあなた。

Java(特にAndroid Java1 )をずっと続けてきてからKotlinに移行した人、そんな人におすすめなのが Land of Lisp!

なぜLand of Lispがおすすめなのか

一体どこからLispが出てきたのか?この本は半分Lispについての本ですが、 半分は関数型プログラミングについての入門書です。
Kotlinは関数型プログラミングのパラダイムを取り入れています。

例えば、高階関数。公式ドキュメントを読む時も高階関数(Higher-Order Functions)とかさらっと出てきます。それが一体なんなのか、なんのためにあるのかちゃんと理解していますか?

例えば、遅延評価。Java 8が使えないAndroidでは初めましての人も多いかと思います。Kotlinではvalで再代入不可な変数を宣言することができますが、これをpropertyで持つとなると当然初期化をする必要があります。クラスのインスタンス化時点では取れない情報を使って初期化したい時、遅延評価が本当に強力な機能となります。
Androidの例で恐縮ですが、Activityのpropertyとしてintentのextraを持ちたい場合、下記のようなコードはかけません。なぜならクラスのインスタンス化時点でthis.intentは正しいintentが入っていないからです。

class HogeActivity : AppCompatActivity() {

    private val fuga = this.intent.getStringExtra(FUGA_KEY) // 動かないよ!

}

そこでvalで宣言するのを諦めてvarにして書けないことはないのですが、イマイチなコードです。

class HogeActivity : AppCompatActivity() {

    private var fuga = "" // 動くけどイマイチだよ!

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        this.fuga = this.intent.getStringExtra(FUGA_KEY)

    }

}

そこで、下記のように遅延初期化すれば解決します。このコードの場合、初めてfugaにアクセスしようとした時にfugaが初期化されます。なので、例えばonCreate()fugaにアクセスするとこの時にはthis.intentに正しい情報が入っているのでfugaには想定通りの値で初期化されます。これでfugaをvalで宣言することができます。

class HogeActivity : AppCompatActivity() {

    private val fuga by lazy {
        this.intent.getStringExtra(FUGA_KEY) // 動くよ!
    }

}

おまけ

そもそもなんでLand of Lispなんか読み始めたかというと昨年の誕生日に同僚氏が自宅に送りつけてきたからです。(当然wishlistには入れていません。)今まで5人くらいに送りつけて実際に読み始めたのは私が初めてだそうです