摘要:一、闭包 ### 闭包 ~~~ 闭包是一种函数,一种比较特殊的函数,它和普通的函数有很大区别: ~~~ # 普通的函数 val addMore1 = (x: Int) => x + 10 ~~~ # 外部变量,也称为自由变量 var more = 10 ~~~ # 闭包 val addMore2 =
阅读全文
摘要:一、柯里化 ### 柯里化 ~~~ 函数编程中,接收多个参数的函数都可以转化为接收单个参数的函数, ~~~ 这个转化过程就叫柯里化(Currying)。 ~~~ Scala中,柯里化函数的定义形式和普通函数类似, ~~~ 区别在于柯里化函数拥有多组参数列表,每组参数用小括号括起来。 ~~~ Scal
阅读全文
摘要:一、部分应用函数 ### 部分应用行数 ~~~ 部分应用函数(Partial Applied Function)也叫偏应用函数, ~~~ 与偏函数从名称上看非常接近,但二者之间却有天壤之别。 ~~~ 部分应用函数是指缺少部分(甚至全部)参数的函数。 ~~~ 如果一个函数有n个参数, 而为其提供少于n
阅读全文
摘要:一、高阶函数 ### 高阶函数 ~~~ 高阶函数:接收一个或多个函数作为输入 或 输出一个函数。 ~~~ 函数的参数可以是变量,而函数又可以赋值给变量, ~~~ 由于函数和变量地位一样,所以函数参数也可以是函数; ~~~ 常用的高阶函数:map、reduce、flatMap、foreach、filt
阅读全文
摘要:一、函数与方法的区别 ### 函数与方法的区别 scala> def addm(x: Int, y: Int): Int = x + y addm: (x: Int, y: Int)Int scala> val addf = (x: Int, y: Int) => x + y addf: (Int,
阅读全文
摘要:一、匿名函数与占位符 ### 匿名函数与占位符 ~~~ 函数没有名字就是匿名函数; ~~~ 匿名函数,又被称为 Lambda 表达式。 Lambda表达式的形式如下: ~~~ (参数名1: 类型1, 参数名2: 类型2, ... ...) => 函数体 ### 编程示例 ~~~ 定义匿名函数 sca
阅读全文
摘要:一、函数字面量及函数的定义 ### 函数字面量及函数的定义 ~~~ Scala中函数为头等公民,不仅可以定义一个函数然后调用它, ~~~ 还可以写一个未命名的函数字面量,然后可以把它当成一个值传递到其它函数或是赋值给其它变量。 ~~~ 函数字面量体现了函数式编程的核心理念。 ~~~ 字面量包括整数字
阅读全文
摘要:NO: Walter Savage Landor:strove with none,for none was worth my strife.Nature I loved and, next to Nature, Art:I warm'd both hands before the fire of
阅读全文
摘要:一、样例类 ### 样例类 ~~~ # case class样例类是Scala中特殊的类。当声明样例类时,以下事情会自动发生: ~~~ 主构造函数接收的参数通常不需要显式使用var或val修饰,Scala会自动使用val修饰 ~~~ 自动为样例类定义了伴生对象,并提供apply方法,不用new关键字
阅读全文
摘要:一、Option与模式匹配 ### Option与模式匹配 ~~~ Scala Option选项类型用来表示一个值是可选的,有值或无值。 ~~~ Option[T] 是一个类型为 T 的可选值的容器,可以通过get()函数获取Option的值。如果值存在, ~~~ Option[T] 就是一个 So
阅读全文
摘要:一、匹配数组、元组、集合 ### 编程示例 def main(args: Array[String]): Unit = { val arr = Array(0, 3, 5) //对Array数组进行模式匹配,分别匹配: //带有指定个数元素的数组、带有指定元素的数组、以某元素开头的数组 arr ma
阅读全文
摘要:一、守卫式匹配 ### 编程示例 // 所谓守卫就是添加if语句 object MatchDemo { def main(args: Array[String]): Unit = { //守卫式 val character = '*' val num = character match { case
阅读全文
摘要:一、匹配类型 ### 匹配类型 ~~~ Scala的模式匹配还有一个强大的功能,它可以直接匹配类型,而不是值。 ~~~ 这一点是Java的switch case做不到的。 ~~~ 匹配类型的语法:case 变量 : 类型 => 代码,而不是匹配值的“case 值 => 代码”这种语法。 ### 代码
阅读全文
摘要:一、字符和字符串匹配 ### 编程示例 def main(args: Array[String]): Unit = { val charStr = '6' charStr match { case '+' => println("匹配上了加号") case '-' => println("匹配上了减
阅读全文
摘要:一、模式匹配 ### 模式匹配 ~~~ Scala没有Java中的switch case,它有一个更加强大的模式匹配机制,可以应用到很多场合。 ~~~ Scala的模式匹配可以匹配各种情况,比如变量的类型、集合的元素、有值或无值。 ~~~ 模式匹配的基本语法结构:变量 match { case 值
阅读全文
摘要:NO: Walter Savage Landor:strove with none,for none was worth my strife.Nature I loved and, next to Nature, Art:I warm'd both hands before the fire of
阅读全文
摘要:一、特质构造顺序 ### 特质构造顺序 ~~~ 在Scala中,trait特质也是有构造器的,也就是trait中的不包含在任何方法中的代码。 ### 构造器以如下顺序执行: ~~~ 执行父类的构造器; ~~~ 执行trait的构造器,多个trait从左到右依次执行; ~~~ 构造trait时会先构造
阅读全文
摘要:一、特质继承类 ### 特质继承类 ~~~ 在Scala中,trait特质也可以继承class类,此时这个class类就会成为所有继承此trait的类的父类。 class MyUtil { def printMessage(msg: String) = println(msg) } // 特质Log
阅读全文
摘要:一、Ordered和Ordering ### Ordered和Ordering ~~~ 在Java中对象的比较有两个接口,分别是Comparable和Comparator。它们之间的区别在于: ~~~ 实现Comparable接口的类,重写compareTo()方法后,其对象自身就具有了可比较性;
阅读全文
摘要:一、带有具体实现的特质 ### 具体方法 ~~~ Scala中的trait特质不仅仅可以定义抽象方法, ~~~ 还可以定义具体实现的方法,这时的trait更像是包含了通用工具方法的类。 ~~~ 比如,trait中可以包含一些很多类都通用的功能方法, ~~~ 比如打印日志等等,Spark中就使用了tr
阅读全文