書籍概要

実践Scala入門

著者
発売日
更新日

概要

Scalaの言語仕様,そしてエコシステムを解説するScala入門書の決定版!
基本的な構文からはじまり,Scalaに特徴的なOption,Eitherといった型によるnull安全なプログラミング,for式などの強力な機能を伴うコレクション操作,Futureを使った並行プログラミングなどの各種言語機能を学べるほか,Scalaでは事実上の標準となっているビルドシステムsbtの使い方やテストといった現場での開発に必須の知識も身につく,Scalaプログラマ必携の一冊です。

こんな方におすすめ

  • Scalaに興味を持っているITエンジニア
  • 業務でScalaを使う必要のあるITエンジニア

目次

第1章 Scalaひとめぐり

  • Scalaの誕生とこれまで
  • なぜScalaか?
  • ScalaはJVM上で動作する言語
  • 著名なユーザ企業
  • 開発環境
  • はじめてのScalaプログラミング
  • Scaladocの読み方
  • ビルドツールの利用

第2章 Scalaの基礎

  • 基本的な型
  • クラスを定義する
  • トレイトを定義する
  • Scalaにおけるstatic
  • 特別なメソッド名
  • ケースクラス ―― メソッドを自動生成する
  • 制御構文
  • 修飾子
  • ジェネリクスと型パラメータ
  • 名前空間とモジュール分割
  • 無名クラス
  • 暗黙の型変換
  • 暗黙クラス ―― 既存のクラスにメソッドを付け足す
  • 暗黙のパラメータ

第3章 Option/Either/Tryによるエラー処理

  • Option ―― 「値がないかもしれない」を表す
  • Either ―― 失敗した理由を示す
  • Try ―― Option/Eitherと同じ感覚で例外を扱う

第4章 コレクション

  • コレクションのデータ型
  • コレクションを操作するAPI
  • コレクションの実装ごとの性能特性
  • Java標準クラスとScala標準クラスの変換
  • for式によるコレクション操作

第5章 並行プログラミング

  • 並行プログラミングのメリットとデメリット
  • Futureの基本的な使い方
  • Futureを扱うためのAPI

第6章 Scalaプロジェクトのビルド

  • sbtの役割
  • はじめてのsbt
  • build.sbtの書き方
  • sbtシェルのコマンド
  • ビルドのスコープ
  • sbtプラグイン
  • sbtのトラブルシューティング

第7章 ユニットテスト

  • テストの重要性
  • Scalaにおけるユニットテスト
  • Scalaで使えるテストフレームワーク
  • ScalaTestを使ったはじめてのテスト
  • ScalaTestを使いこなす
  • Mockitoを使ったモックテスト
  • ScalaCheckを使ったプロパティベーステスト

第8章 知っておきたい応用的な構文

  • コンパニオンオブジェクト ―― 同名のクラスへの特権的なアクセス権を持つオブジェクト
  • 部分関数 ―― 呼び出し前の引数チェック
  • デフォルト引数 ―― 引数を省略したときの既定値を指定する
  • 名前付き引数 ―― メソッドの引数に名前をつけて呼び出せるようにする
  • 値クラス ―― オブジェクト生成のオーバーヘッドを避ける
  • 型メンバ ―― クラスやトレイト内だけで有効な型の別名を付ける
  • 自分型アノテーション ―― トレイトやクラスに継承でない依存関係をもたせる
  • メソッド引数におけるブロック式 ―― メソッド呼び出しをより簡潔に記述する
  • 複数の引数リストを持つメソッド ―― 部分適用を容易にする
  • η-expansion ―― メソッドを関数に変換する
  • 名前渡し引数 ―― 引数の評価タイミングを制御する
  • 抽出子 ―― 独自のパターンを定義する
  • implicitの探索範囲
  • 特殊なメソッド

第9章 よりよいコーディングを目指して

  • 可能な限り不変にする
  • 式指向なスタイルで書く
  • そのほかのTips

サポート

正誤表

本書の以下の部分に誤りがありました。ここに訂正するとともに,ご迷惑をおかけしたことを深くお詫び申し上げます。

(2019年7月4日最終更新)

第2章 p.74:3つめのコードブロック1行目

for (e <- List(1, 2, 3) yield {

for (e <- List(1, 2, 3)) yield {

第2章 p.96:2つめのコードブロック1行目

def sumString(list: List[String]): Double = list.foldLeft(""){

def sumString(list: List[String]): String = list.foldLeft(""){

(以下2019年5月17日更新)

第7章 P.228:下部コードブロック7行目

Mockito.mock(classOf[UserRepository])

Mockito.mock(classOf[SpreadsheetReader])

(以下2019年3月5日更新)

第2章 P.71:上部のコードブロック2行目

num: Int = 50
num: Int = 40

第2章 P.74:上部のコードブロック全体


scala> for (x <- 1 to 3; y <- 1 until 3 if x != y) {
     | println("x = " + x + " y = " + y)
     | }
x = 1 y = 2
x = 2 y = 1
x = 3 y = 1
x = 3 y = 2

第2章 P.97:上部のコードブロック全体


scala> def sum[T](list: List[T])(adder: Adder[T]): T = {
     | list.foldLeft(adder.zero){(x, y) => adder.plus(x,y)
     | }


scala> def sum[T](list: List[T])(adder: Adder[T]): T = {
     | list.foldLeft(adder.zero){(x, y) => adder.plus(x,y)}
     | }

(以下2018年11月26日更新)

第2章 P.98 上部のコードブロック2行目(IntAdderの実装)


def zero: Int


def zero: Int = 0

第4章 P.131 図4-5「takeなどで要素を取り出す」

正

第4章 P.132 図4-6「dropなどで要素を捨てる」

正

第5章 P.159 コードブロックの先頭


コードブロックの先頭に以下の行を追加
var i = 0

第7章 P.218 コードブロック全体


import scala.collection.mutable

trait ConfigManager {

  val envPrefix: String
  val config: mutable.Map[String, String]

  def readConfig(key: String): Option[String] =
    config.get(s"$envPrefix.$key")

  def upsertConfig(key: String, value: String): Unit =
    config.update(s"$envPrefix.$key", value)

  def numOfConfig(): Int = config.size

  def clearAll(): Unit = config.clear()
}


第8章 P.252 下部コードブロック1行目


def if__[A](condition: Boolean)(thenClause: => A)(elseClause: => A): A


def if__[A](condition: Boolean)(thenClause: => A)(elseClause: => A): A = {

第8章 P.254 2つめのコードブロック4行目


case _ (_) =>


case _ =>

第8章 P.255 コードブロック4行目


case __) =>


case _ =>

第8章 P.256 上部コードブロック8行目


def zero: Int


def zero: Int = 0

第8章 P.258 上部コードブロック2行目


val println(any.asInstanceOf[String].substring(1))


println(any.asInstanceOf[String].substring(1))

(以下2018年11月8日更新)

第2章 p.64:上部のコードブロック全体(Shopクラスの実装)


class Staff(val name: String, val age: Int)

class Shop(val name: String) extends AnyRef with Enumerable[Staff] with
Namable {
  private[this] val staffs: List[Staff] = List(new Staff("太郎", 18), new
Staff("花子", 20))

  // foreachの実装を提供する
  override def foreach[B](f: Staff => B): Unit = staffs.foreach(f)
  ...
}
(以下省略)

第4章 p.127:上部のコードブロック1行目および5行目のコメント


// immutableSeqは不変なSeq
scala> val immutableSeq = scala.collection.immutable.Seq(1, 2, 3)
immutableSeq: scala.collection.immutable.Seq[Int] = List(1, 2, 3)

// mutableSeqは可変なSeq
scala> val mutableSeq = scala.collection.mutable.Seq(1, 2, 3)
mutableSeq: scala.collection.mutable.Seq[Int] = ArrayBuffer(1, 2, 3)

第6章 p.187:コードブロック4行目


version := "0.1.0-SNAPSHOT",


version := "0.1",


(以下2018年10月31日更新)

第2章 P.62 コードブロック7行目(mapメソッドの実装)

var members = Buffer.empty[A]

var members = Buffer.empty[B]

第4章 P.137 図4-12左上の数字(畳み込みの最後の値)

3
1

商品一覧