読者です 読者をやめる 読者になる 読者になる

KZKY memo

自分用メモ.

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

アクセス修飾子

関数

  • 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)

関数オブジェクト

  • 通常定義
    • 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

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に対応する並列コレクションに変換