参考:http://docs.scala-lang.org/cheatsheets/index.html、http://docs.scala-lang.org/、http://www.scala-lang.org/api/2.10.4/#package

变量  
var x = 5 变量

val x = 5
不好
x=6
不变
var x: Double = 5 显式类型
功能  

def f(x: Int) = { x*x }
不好
def f(x: Int) { x*x }
定义函数
隐藏错误:无=这是一个单元返回过程; 造成严重破坏

def f(x: Any) = println(x)
不好
def f(x) = println(x)
定义函数
语法错误:每个arg需要类型。
type R = Double 类型别名
def f(x: R) 与
def f(x: => R)
按值
呼叫按名称(懒惰参数)
(x:R) => x*x 匿名功能
(1 to 5).map(_*2) 与
(1 to 5).reduceLeft( _+_ )
匿名函数:下划线是位置匹配的arg。
(1 to 5).map( x => x*x ) 匿名函数:要使用一个arg两次,必须命名它。

(1 to 5).map(2*)
不好
(1 to 5).map(*2)
匿名函数:绑定中缀方法 使用2*_了理智的缘故吧。
(1 to 5).map { x => val y=x*2; println(y); y } 匿名函数:块样式返回最后一个表达式。
(1 to 5) filter {_%2 == 0} map {_*2} 匿名函数:管道风格。(或者也是parens)。
def compose(g:R=>R, h:R=>R) = (x:R) => g(h(x)) 
val f = compose({_*2}, {_-1})
匿名功能:传入多个块,需要外部的包袱。
val zscore = (mean:R, sd:R) => (x:R) => (x-mean)/sd currying,语法明显。
def zscore(mean:R, sd:R) = (x:R) => (x-mean)/sd currying,语法明显
def zscore(mean:R, sd:R)(x:R) = (x-mean)/sd 咖喱,糖语法。但是之后:
val normer = zscore(7, 0.4) _ 需要尾随下划线才能得到部分,只有糖版本。
def mapmake[T](g:T=>T)(seq: List[T]) = seq.map(g) 泛型类型。
5.+(3); 5 + 3 
(1 to 5) map (_*2)
中缀糖。
def sum(args: Int*) = args.reduceLeft(_+_) 可变参数。
 
import scala.collection._ 通配符导入。
import scala.collection.Vector 
import scala.collection.{Vector, Sequence}
选择性进口。
import scala.collection.{Vector => Vec28} 重命名导入。
import java.util.{Date => _, _} 从Date中除外的java.util全部导入。
package pkg 在文件开始 
package pkg { ... }
申报一个包裹。
数据结构  
(1,2,3) 元组文字。(Tuple3
var (x,y,z) = (1,2,3) 解构绑定:通过模式匹配解开元组。

var x,y,z = (1,2,3)
隐藏的错误:每个分配给整个元组。
var xs = List(1,2,3) 列表(不可变)。
xs(2) paren索引。(幻灯片
1 :: List(2,3) 利弊。
1 to 5 与...一样 1 until 6 
1 to 10 by 2
范围糖。
() (空的parens) Unit类型的唯一成员(如C / Java void)。
控制结构  
if (check) happy else sad 有条件的。
if (check) happy 
与...一样
if (check) happy else ()
有条件的糖。
while (x < 5) { println(x); x += 1} while循环。
do { println(x); x += 1} while (x < 5) 做while循环。
import scala.util.control.Breaks._
breakable {
for (x <- xs) {
if (Math.random < 0.1)
break
}
}
打破。(幻灯片
for (x <- xs if x%2 == 0) yield x*10 
与...一样
xs.filter(_%2 == 0).map(_*10)
理解:过滤器/地图
for ((x,y) <- xs zip ys) yield x*y 
与...一样
(xs zip ys) map { case (x,y) => x*y }
理解:解构约束
for (x <- xs; y <- ys) yield x*y 
与...一样
xs flatMap {x => ys map {y => x*y}}
理解:交叉产品
for (x <- xs; y <- ys) {
println("%d/%d = %.1f".format(x, y, x/y.toFloat))
}
理解:势在必行
sprintf式
for (i <- 1 to 5) {
println(i)
}
理解:迭代包括上限
for (i <- 1 until 5) {
println(i)
}
理解:迭代省略上界
模式匹配  

(xs zip ys) map { case (x,y) => x*y }
不好
(xs zip ys) map( (x,y) => x*y )
用于模式匹配的函数参数用例。

val v42 = 42
Some(3) match {
case Some(v42) => println("42")
case _ => println("Not 42")
}
“v42”被解释为与任何Int值匹配的名称,并且打印“42”。

val v42 = 42
Some(3) match {
case Some(`v42`) => println("42")
case _ => println("Not 42")
}
带有反引号的“v42”被解释为现有的val v42,并且“Not 42”被打印。

val UppercaseVal = 42
Some(3) match {
case Some(UppercaseVal) => println("42")
case _ => println("Not 42")
}
UppercaseVal被视为现有的val,而不是新的模式变量,因为它以大写字母开头。因此,UppercaseVal检查包含在内的值3,并打印“不是42”。
面向对象  
class C(x: R) 构造函数参数 - x仅在类体中可用
class C(val x: R)
var c = new C(4)
c.x
构造函数参数 - 自动公共成员定义
class C(var x: R) {
assert(x > 0, "positive please")
var y = x
val readonly = 5
private var secret = 1
def this = this(42)
}
构造函数是类体
声明一个public成员
声明一个gettable但不可设置的成员
声明一个私有成员的
替代构造函数
new{ ... } 匿名类
abstract class D { ... } 定义一个抽象类。(非可创建)
class C extends D { ... } 定义一个继承的类。
class D(var x: R)
class C(x: R) extends D(x)
继承和构造函数参数。(心愿:默认自动传递params)
object O extends D { ... } 定义一个单例。(模块样)
trait T { ... }
class C extends T { ... }
class C extends D with T { ... }
特征。
接口与-实施。没有构造函数参数。可混合的
trait T1; trait T2
class C extends T1 with T2
class C extends D with T1 with T2
多重特质。
class C extends D { override def f = ...} 必须声明方法覆盖。
new java.io.File("f") 创建对象。
坏的
new List[Int]

List(1,2,3)
类型错误:抽象类型
代替,惯例:可调用的工厂阴影类型
classOf[String] 类文字。
x.isInstanceOf[String] 类型检查(运行时)
x.asInstanceOf[String] 类型转换(运行时)
x: String 归属(编译时间)

1.关键字

abstract    case        catch       class       def
do else extends false final
finally for forSome if implicit
import lazy macro match new
null object override package private
protected return sealed super this
throw trait try true type
val var while with yield
_    :    =    =>    <-    <:    <%     >:    #    @

2.符号
  1. 空白字符。\u0020 | \u0009 | \u000D | \u000A

  2. 字母包括小写字母(Ll),大写字母(Lu),标题字母(Lt),其他字母(Lo),字母数字(Nl)以及两个字母\u0024 ‘$’和数字\u005F ‘_’

  3. 数字‘0’ | … | ‘9’

  4. 括号‘(’ | ‘)’ | ‘[’ | ‘]’ | ‘{’ | ‘}’

  5. 分隔符字符‘`’ | ‘'’ | ‘"’ | ‘.’ | ‘;’ | ‘,’

  6. 操作员字符。这些包含所有可打印的ASCII字符(\u0020\u007E),不在上述集合中,数学符号(Sm)和其他符号(So)。


‘\‘ ‘b‘ \u0008 退格 BS
‘\‘ ‘t‘ \u0009 水平选项卡 HT
‘\‘ ‘n‘ \u000a 换行 LF
‘\‘ ‘f‘ \u000c 形成饲料 FF
‘\‘ ‘r‘ \u000d 回车 CR
‘\‘ ‘"‘ \u0022 双引号 "
‘\‘ ‘'‘ \u0027 单引号 '
‘\‘ ‘\‘ \u005c 反斜线 \
 

Spark记录-Scala语法基础的更多相关文章

  1. Scala 语法基础

    一 简介 Scala 是一门多范式(multi-paradigm)的编程语言,设计初衷是要集成面向对象编程和函数式编程的各种特性.Scala 运行在Java虚拟机上,并兼容现有的Java程序.Scal ...

  2. Spark记录-Scala基础语法

    如果您熟悉Java语言语法和编程,那么学习Scala将会很容易.Scala和Java之间最大的句法差异在于行结束字符的分号(;) 是可选的. 当编写Scala程序时,它可以被定义为通过调用彼此的方法进 ...

  3. Spark记录-Scala记录(基础程序例子)

    import scala.util.control._ object learnning { def main(args:Array[String]):Unit={ val n:Int=10 prin ...

  4. Spark记录-Scala基础程序实例

    object learn { def main(args:Array[String]):Unit={ println("请输入两个数字:") var a:Int=Console.r ...

  5. Spark记录-Scala程序例子(函数/List/match/option/泛型/隐式转换)

    object func { def main(args:Array[String]):Unit={ //函数赋值给变量时, 必须在函数后面加上空格和下划线. def sayHello(name: St ...

  6. Spark记录-scala快速入门

    1.hello world程序 object HelloWorld { def main(args: Array[String]) { println("Hello,World!" ...

  7. Spark记录-Scala类和对象

    本章将介绍如何在Scala编程中使用类和对象.类是对象的蓝图(或叫模板).定义一个类后,可以使用关键字new来创建一个类的对象. 通过对象可以使用定义的类的所有功能. 下面的图通过一个包含成员变量(n ...

  8. Spark记录-Scala集合

    Scala列表 Scala列表与数组非常相似,列表的所有元素都具有相同的类型,但有两个重要的区别. 首先,列表是不可变的,列表的元素不能通过赋值来更改. 其次,列表表示一个链表,而数组是平的. 具有类 ...

  9. Spark记录-Scala多线程

    Scala多线程 多线程是同时执行多个线程的过程. 它允许您独立执行多个操作.可以通过使用多线程来实现多任务.线程是轻量级的子进程,占用较少的内存.多线程用于在Scala中开发并发应用程序. Scal ...

随机推荐

  1. 博客配置Racket代码字体

    我想在博客园的文章中插入Racket代码,但是博客园的代码块和高亮都太难看了,如果能把scribble/manual的CSS文件中的Racket代码块的配置拿出来就可以有漂亮的Racket代码高亮了, ...

  2. GitHub 新手教程 七,Git GUI 新手教程(4),上传本地代码库到GitHub

    1,打开 GitGUI,单击我们之前克隆好的本地库: 2,按图示顺序点击按钮: 3,按图示顺序点击按钮,输入您的 Sign 信息: 4,按图示顺序点击按钮: 5,弹出新的窗口后,点击 “Push” 按 ...

  3. cocos2dx内存优化

    纹理消耗了大量内存 在大部分情况下,是纹理(textures)消耗了游戏程序大量的内存.因此,纹理是我们首要考虑优化的对象 纹理加载 cocos2d里面纹理加载分为两个阶段:从图片文件中创建一个Ima ...

  4. 关于运行“基于极限学习机ELM的人脸识别程序”代码犯下的一些错误

    代码来源 基于极限学习机ELM的人脸识别程序 感谢文章主的分享 我的环境是 win10 anaconda Command line client (version 1.6.5)(conda 4.3.3 ...

  5. python 爬虫学习之路

    2016-6-18 --今天实现了第一个用urllib2实现的爬虫程序. --过程中发现 req = urllib2.Request(url,headers = headers) 总是报错: 主要原因 ...

  6. 将搬家至CSDN

    emmm,感觉没利用好博客,自己也弄了一个github上面的hexo博客https://clarkkun.github.io/,但是死活传不上去内容,尴尬 ̄□ ̄||,三个博客齐头并进吧

  7. CentOS75 安装 telnet 进行使用.

    1. 安装必须要的服务 yum install xinetd telnet telnet-server 2. 修改增加root用户登录权限 vi /etc/securetty 在最后面增加两行 pts ...

  8. BroadcastReceiver介绍

    参考资料 : 基础总结篇之五:BroadcastReceiver应用详解 BroadcastReceiver用于接收广播信息,可以通过sendBroadcast等方法进行发送.sendBroadcas ...

  9. 关于PSP(个人软件过程)

    在第一堂课时,杨老师就提到了PSP(个人软件过程),但是我从2016年3月10日才开始进行粗略的PSP时间管理统计,这是长迭代,用老师的话“差评”.然后在2016年3月11日下午的软件项目管理上,老师 ...

  10. USACO 2012 December ZQUOJ 24128 Wifi Setup(动态dp)

    题意:给出在同一条直线上的n个点和两个数A,B,现在要在这条直线上放置若干个信号塔,每个信号塔有一个r值,假设它的位置是x,则它能覆盖的范围是x-r~x+r,放置一个信号塔的花费是A+B*r,问要覆盖 ...