対象
オブジェクトのコンテンツは静的です
クラス名と同じ場合、コンパニオンオブジェクトになります。
Scalaには静的キーワードはありません
アプリを継承し、メインメソッドを省略できます
適用方法
Applyメソッドはオブジェクトでのみ作成できます
class Student(var name : String)
object Student {
def apply(name : String) = {
println("调用了apply方法")
new Student(name)
}
def main(args : Array[String]) : Unit = {
var student = Student("Freedom")
println(student.name)
}
}
高次関数
(1)地図
ループに相当し、コレクションの各要素を操作し(関数を受け取り)、新しいコレクションを返します
var list = List(1,2,3)
list.map((i : Int) => i * 2)
list.map(_*2)
(2)foreach
foreachには戻り値がありません
(3)フィルター
フィルター、一致するデータを選択、パラメーターにはブール値を返す関数が必要、trueであるすべてのデータをフィルターで除外
var list = List(1,2,3)
list.filter((i : Int) => i % 2 == 0)
list.filter(_%2 == 0)
(4)zip
2つのセットをマージ
List(1,2,3,).zip(List(4,5,6))
List(1,2,3).zip(List(4,5))
(5)パーティション
アサーションの結果に基づいたパーティション(つまり、特定の条件、無名関数)
var list = List(1,2,3)
list.partition((i : Int) => i % 2 == 0)
list.partition(_%2 == 0)
(6)検索
条件を満たす最初の要素を見つける
var list = List(1,2,3)
list.find((i : Int) => i % 2 == 0)
list.find(_%2 == 0)
(7)平らにする
条件を満たす最初の要素を見つける
List(List(1,2,3),List(4,5,6)).flatten
(8)フラットマップ
地図と同等+平坦化
var list = List(List(1,2,3),List(4,5,6))
list.flatmap(i => i.map(_*2))
クロージャー(関数のネスト)
関数では、別の関数の定義を含み、内部関数で外部関数の変数にアクセスできます
def out(factor: Double) = {
(x : Double) => x * factor
}
var triple = out(3)
triple(10)
out(3)(10)
カレー
複数のパラメーターを持つ関数を関数チェーンに変換します。各ノードは単一の関数です
def add(x: Int,y : Int) = x + y //原始
def add(x : Int) = (y : Int) => x + y //闭包
def add(x : Int)(y : Int) = x + y