Scala 超まとめメモ
Scalaをある程度理解してきたので,まとめのメモ
基本
switch-case
- obj match {case obj_1:type if () => processing; case obj_2:type if () => processing; ...}
apply
- obj.method, new ClassNameがobj(), ClassName()で呼び出せる
unapply
- companion objectのmatch比較で使用される
- 制約
- 引数を返す
- Booleanを返す
case class
- いろいろ勝手に定義してくれるクラス
method
- 引数0なら呼び出し時に()を省略可能
tuple
- (10 -> 10)
- (5,5)
- 21くらいまで可能
- (1,2,3,4)
- (1,2,3,4,5)
loop
- collection.foreach(e => processing)
- for(i <- collection; j <- collection; ...; if (condition)) {}
- yield で値をList形式で出力可能
- while(conditon) {}
- do {} while ()
object
- singleton class
- paremter(コンストラクタ)をもてない
- 同じ名前のクラスを作るとcompanion object
trait
- paremterをもてない
class
アクセス修飾子
- URLs
- access_modifier[]
- [this] 自分から
- [class]
関数
- def func (arg_1:type_1, ..., arg_n:type_n): ret_type = {processing}
- def func(f: (arg_type) => ret_type) = {processing with f} // 関数を受け取る
- def func(): String => String = {(s: String) => "return " + s} // 関数を返す
- 部分適用
- _: typeをつける
- var f1 = func(6, _: Int)
- _: typeをつける
関数オブジェクト
- 通常定義
- var f = (arg_1:type_1, ... ,arg_n:type_n) => {processing}: ret_type
- 関数リテラル
- var f: (arg_1: type_1, ... , arg_n: type_n) => {processing}: ret_type
- ((n: Int) => n + 1)(123)で実行
- プレースホルダは、関数リテラルの引数部分を「_」で置き換える構文
- 関数オブジェクトを受け取る関数
- def func(f: (Int, Int) => Int) = {processing; f(1, 2); processing; }
- func((a, b) => a + b)
- def func(f: (Int, Int) => Int)はdef func(f: type)とも考えられる
- call-by-name
- def func(f: => R)
- {}を渡すことが可能
- 関数リテラル,普通の値も渡せる
- 名前の通り名前で呼び出して,呼び出した時に遅延評価される
- 関数を関数オブジェクトに変換
- var f = func _
- curried (カリー化)
- func_obj(arg_1, arg_n2, ..., arg_n).curried = func_obj(arg_1)(arg_n2)...(arg_n)
- 関数objの一つ目の引数を一つとり残りを関数として返す関数objにする
- func.curried
abstract
- =~ で値を定義しないと,抽象フィールド,抽象メソッドとなる
implicit
- URLs
- methodの引数にimplicitをつける場合
type
- クラス,トレイト,関数等のalias
- type T = Int
symbol
- 'name
- Symbol(name)
generics (parameterized type)
一般記法 (通常はinvariant)
- ClassName[A] {}
- TraitName[A] {}
上限境界
- [C <: ClassName]
下限境界
- [A >: ClassName]
covariant
- [+T]
- コレクションのparameterの関係が子クラスを親クラスに代入可能
contravariant
- [-T]
- コレクションのparameterの関係が親クラスを子クラスに代入可能
_ のいろいろ
default値
プレースホルダ
- 関数リテラルの引数部分を「_」で置き換える
- def func(f: (Int, Int) => Int) = f(1, 2)
- func((a, b) => a + b) は func(_ + _)
関数の部分適用時の引数指定
- def func(a: Int, b: Int) = a * b
- val a = func(6, _: Int)
collection
基本はimmutableになっている(要素を追加したらimmutable collectionが返される)
- mutable listは要素追加時にnewして返している(コード上そうみえる)ので遅い
- 通常Listは一方方向List
一般
- collection.collect {case e:Int if (e % 2 == 1) => e}
- collection.map(e => processing)
- 要素の追加
- +:
- 先頭に追加したnew Collection
- elm +: collection
- :+
- 末尾に追加したnew Collection
- +:=
- 先頭に追加
- :+=
- 末尾に追加
- ++
- collection + collection
- +:
並列
- collection.parでcollectionに対応する並列コレクションに変換