1.scala是一种纯面向对象的语言,每个值都是对象。对象的数据类型以及行为由类和特质描述
2.类的扩展有2种机制:继承和混入机制
3.scala是一种函数式语言,其函数也能当成值来使用
4.scala使用actor作为其并发模型,actor是类似线程的实体,通过邮箱发收消息。actor可以复用线程,因此在程序中可用数百万个actor,而线程只能创建数千个
5.scala与java语法最大的区别是:scala语句末尾的分号是可选的
6.所有类名首字母大写,方法名首字母小写,程序文件名与对象名称可以不匹配,但建议保留匹配的习惯;def main(args: Array[String]),scala程序从main()方法开始处理
7.Unit表示无值,同void.Unit只有一个实例值,写成()
8.Nothing类型在scala的类层级的最低端,它是任何其它类型的子类型
9.Any是所有其它类的超类
10.AnyRef类是scala里所有引用类的基类
11.符号字面量‘<标识符>被映射成预定义类scala.Symbol的实例
如: 符号字面量 'x 是表达式 scala.Symbol("x") 的简写,符号字面量定义如下:
package scala
final case class Symbol private (name: String) {
override def toString: String = "'" + name
}
12.多行字符串用三个双引号来表示分割符,实例如下:
val foo = """菜鸟教程
www.runoob.com
www.w3cschool.cc
www.runnoob.com
以上三个地址都能访问"""
13.var声明变量,val声明常量,修改常量时会在编译时报错
14.变量类型声明一定要有初始值,否则会报错
var VariableName : DataType [=  Initial Value]

val VariableName : DataType [= Initial Value]
15.默认情况下访问级别是public
16.scala中的函数其实就是继承了trait的类对象,scala中使用val语句定义函数,def定义方法
def functionName ([参数列表]) : [return type]
17.scala在函数调用的时候,可以通过指定参数名,并且不按照顺序向函数传递参数,实例如下:
object Test {
def main(args: Array[String]) {
printInt(b=5, a=7);
}
def printInt( a:Int, b:Int ) = {
println("Value of a : " + a );
println("Value of b : " + b );
}
}
18.for语法
18.1.Range风格的for循环
for( var x <- Range ){
statement(s);
}

以上语法中,Range 可以是一个数字区间表示 i to j ,或者 i until j。左箭头 <- 用于为变量 x 赋值。

i to j 包含j
i until j 不包含j
18.2.分号(;)风格的for循环,可以设置多个区间同时循环,即多重循环,实例:
object Test {
def main(args: Array[String]) {
var a = 0;
var b = 0;
// for 循环
for( a <- 1 to 3; b <- 1 to 3){
println( "Value of a: " + a );
println( "Value of b: " + b );
}
}
}

输出结果:

Value of a: 1
Value of b: 1
Value of a: 1
Value of b: 2
Value of a: 1
Value of b: 3
Value of a: 2
Value of b: 1
Value of a: 2
Value of b: 2
Value of a: 2
Value of b: 3
Value of a: 3
Value of b: 1
Value of a: 3
Value of b: 2
Value of a: 3
Value of b: 3
18.3.for遍历集合,语法:
for( var x <- List ){
statement(s);
}

实例:

object Test {
def main(args: Array[String]) {
var a = 0;
val numList = List(1,2,3,4,5,6); // for 循环
for( a <- numList ){
println( "Value of a: " + a );
}
}
}
18.4.for循环过滤,语法:
for( var x <- List
if condition1; if condition2...
){
statement(s);

实例:

object Test {
def main(args: Array[String]) {
var a = 0;
val numList = List(1,2,3,4,5,6,7,8,9,10); // for 循环
for( a <- numList
if a != 3; if a < 8 ){
println( "Value of a: " + a );
}
}
}
18.5.for循环使用yield将循环过滤的返回值用作变量存储,语法:
var retVal = for{ var x <- List
if condition1; if condition2...
}yield x

大括号用于保存变量和条件,retVal是变量,循环中的yield会把当前的元素记下来,保存在集合中,循环结束后将返回该集合。实例:

object Test {
def main(args: Array[String]) {
var a = 0;
val numList = List(1,2,3,4,5,6,7,8,9,10); // for 循环
var retVal = for{ a <- numList
if a != 3; if a < 8
}yield a // 输出返回值
for( a <- retVal){
println( "Value of a: " + a );
}
}
}

执行结果:

value of a: 1
value of a: 2
value of a: 4
value of a: 5
value of a: 6
value of a: 7
19.scala允许最后一个参数是可以重复的,通过在参数的类型之后放一个星号来设置可变参数,例如:
object Test {
def main(args: Array[String]) {
printStrings("Runoob", "Scala", "Python");
}
def printStrings( args:String* ) = {
var i : Int = 0;
for( arg <- args ){
println("Arg value[" + i + "] = " + arg );
i = i + 1;
}
}
}

执行结果为:

Arg value[0] = Runoob
Arg value[1] = Scala
Arg value[2] = Python
20. scala偏应用函数是一种表达式,你不需要提供函数所需要的所有参数,只需要提供部分参数,或不提供所需参数,例如:
import java.util.Date

object Test {
def main(args: Array[String]) {
val date = new Date
val logWithDateBound = log(date, _ : String) logWithDateBound("message1" )
Thread.sleep(1000)
logWithDateBound("message2" )
Thread.sleep(1000)
logWithDateBound("message3" )
} def log(date: Date, message: String) = {
println(date + "----" + message)
}
}

输出结果为:

Mon Dec 02 12:53:56 CST 2013----message1
Mon Dec 02 12:53:56 CST 2013----message2
Mon Dec 02 12:53:56 CST 2013----message3
21. 在scala中无法直接操作方法,如果要操作方法,必须先将其转换成函数。有两种方法转换成函数:
val f1 = m _

在方法名称m后面紧跟一个空格和下划线告诉编译器将方法m转换成函数,而不是要调用这个方法。也可以显示地告诉编译器需要将方法转换成函数:

val f1:(Int) => Int = m
22.闭包是一个函数,返回值依赖于声明在函数外部的一个或多个变量。如:
var factor = 3
val multiplier = (i:Int) => i * factor

这里我们引入的一个自由变量factor,这个变量定义在函数外面,这样定义的函数变量multiplier成为一个“闭包”,因为它引用到函数外面的定义的变量,定义这个函数的过程是将这个自由变量捕获而构成一个封闭的函数。完整实例:

object Test {
def main(args: Array[String]) {
println( "muliplier(1) value = " + multiplier(1) )
println( "muliplier(2) value = " + multiplier(2) )
}
var factor = 3
val multiplier = (i:Int) => i * factor
}

输出结果:

muliplier(1) value = 3
muliplier(2) value = 6
23.数组的定义与引用

一维数组创建

var z:Array[String] = new Array[String](3)

var z = new Array[String](3)

var z = Array("Runoob", "Baidu", "Google")

引用第i元素,注意是(),而不是[]

var myList = Array(1.9, 2.9, 3.4, 3.5)
println(myList(i))

多维数组定义

var myMatrix = ofDim[Int](3,3)

数组详细介绍

24.scala集合分为可变集合和不可变集合,对可变集合本身可以进行增删改操作,对不可变集合进行增删改操作时,会返回一个新的集合,同时保证原有集合不发生改变。

集合详细介绍

25.默认情况下scala使用不可变Map,如果你要使用可变集合,你需要显式引入import scala.collection.mutable.Map类,在scala中你可以同时使用可变与不可变Map,可变的使用mutable.Map.

初始化不可变Map:

// 空哈希表,键为字符串,值为整型
var A:Map[Char,Int] = Map() // Map 键值对演示
val colors = Map("red" -> "#FF0000", "azure" -> "#F0FFFF")

添加key-value对,使用+号,如下:

A += ('I' -> 1)
A += ('J' -> 5)
A += ('K' -> 10)
A += ('L' -> 100)

Map可以使用++运算符或者Map.++()方法来连接两个Map,Map合并时会移除重复的key.

26.元组也是不可变的,但与列表不同的是元组可以包含不同类型的元素,元组的值是通过将单个的值包含在圆括号中构成的。例如:
val t = (1, 3.14, "Fred")

以上实例在元组中定义了三个元素,对应的类型分别为[Int, Double, java.lang.String]。也可以使用以上方式来定义:

val t = new Tuple3(1, 3.14, "Fred")

元组的实际类型取决于它的元素的类型,比如 (99, "runoob") 是 Tuple2[Int, String]。 ('u', 'r', "the", 1, 4, "me") 为 Tuple6[Char, Char, String, Int, Int, String]。

27.目前scala支持的元组最大长度为22.对于更大长度可以使用集合,或者扩展元组。
28.访问元组的元素可以通过数字索引,如:
val t = (4,3,2,1)

我们可以使用t._1访问第一个元素,t._2访问第二个元素;

29.Scala Option(选项)类型用来表示一个值是可选的(有值或无值)。Option[T] 是一个类型为 T 的可选值的容器: 如果值存在, Option[T] 就是一个 Some[T] ,如果不存在, Option[T] 就是对象 None 。如:
// 虽然 Scala 可以不定义变量的类型,不过为了清楚些,我还是
// 把他显示的定义上了 val myMap: Map[String, String] = Map("key1" -> "value")
val value1: Option[String] = myMap.get("key1")
val value2: Option[String] = myMap.get("key2") println(value1) // Some("value1")
println(value2) // None
30.在类中重写一个非抽象方法必须使用override修饰符;只有主构造函数才可以往基类的构造函数里写参数;在子类中重写超类的抽象方法时,你不需要使用override关键字。
31.在 Scala 中,是没有 static 这个东西的,但是它也为我们提供了单例模式的实现方法,那就是使用关键字 object。Scala 中使用单例模式时,除了定义的类之外,还要定义一个同名的 object 对象,它和类的区别是,object对象不能带参数。当单例对象与某个类共享同一个名称时,他被称作是这个类的伴生对象:companion object。你必须在同一个源文件里定义类和它的伴生对象。类被称为是这个单例对象的伴生类:companion class。类和它的伴生对象可以互相访问其私有成员。

单例对象实例:

/* 文件名:Marker.scala
* author:菜鸟教程
* url:www.runoob.com
*/ // 私有构造方法
class Marker private(val color:String) { println("创建" + this) override def toString(): String = "颜色标记:"+ color } // 伴生对象,与类共享名字,可以访问类的私有属性和方法
object Marker{ private val markers: Map[String, Marker] = Map(
"red" -> new Marker("red"),
"blue" -> new Marker("blue"),
"green" -> new Marker("green")
) def apply(color:String) = {
if(markers.contains(color)) markers(color) else null
} def getMarker(color:String) = {
if(markers.contains(color)) markers(color) else null
}
def main(args: Array[String]) {
println(Marker("red"))
// 单例函数调用,省略了.(点)符号
println(Marker getMarker "blue")
}
}
32.trait(特征)相当于Java的接口,与接口不同的是,它还可以定义属性和方法的实现

scala笔记,主要摘自网络教程的更多相关文章

  1. 【学习笔记】Iperf3网络性能测试工具

    [学习笔记]Iperf3网络性能测试工具 网络性能评估主要是监测网络带宽的使用率,将网络带宽利用最大化是保证网络性能的基础,但是由于网络设计不合理.网络存在安全漏洞等原因,都会导致网络带宽利用率不高. ...

  2. Java基础复习笔记系列 九 网络编程

    Java基础复习笔记系列之 网络编程 学习资料参考: 1.http://www.icoolxue.com/ 2. 1.网络编程的基础概念. TCP/IP协议:Socket编程:IP地址. 中国和美国之 ...

  3. 笔记之Python网络数据采集

    笔记之Python网络数据采集 非原创即采集 一念清净, 烈焰成池, 一念觉醒, 方登彼岸 网络数据采集, 无非就是写一个自动化程序向网络服务器请求数据, 再对数据进行解析, 提取需要的信息 通常, ...

  4. python3.4学习笔记(十四) 网络爬虫实例代码,抓取新浪爱彩双色球开奖数据实例

    python3.4学习笔记(十四) 网络爬虫实例代码,抓取新浪爱彩双色球开奖数据实例 新浪爱彩双色球开奖数据URL:http://zst.aicai.com/ssq/openInfo/ 最终输出结果格 ...

  5. Android:控件WebView显示网页 -摘自网络

    WebView可以使得网页轻松的内嵌到app里,还可以直接跟js相互调用. webview有两个方法:setWebChromeClient 和 setWebClient setWebClient:主要 ...

  6. C# 中的内存管理,摘自网络

    C#编程的一个优点是程序员不需要关心具体的内存管理,尤其是垃圾收集器会处理所有的内存清理工作.虽然不必手工管理内存,但如果要编写高质量的代码,还是要理解后台发生的事情,理解C#的内存管理.本文主要介绍 ...

  7. 【RL-TCPnet网络教程】第3章 初学RL-TCPnet的准备工作及其快速上手

    第3章       初学RL-TCPnet的准备工作及其快速上手 俗话说万事开头难,学习一门新的知识,难的往往不是知识本身,而是如何快速上手,需要什么资料和开发环境.一旦上手后,深入的学习就相对容易些 ...

  8. 2018-12-09 疑似bug_中文代码示例之Programming in Scala笔记第九十章

    续前文: 中文代码示例之Programming in Scala笔记第七八章 源文档库: program-in-chinese/Programming_in_Scala_study_notes_zh ...

  9. 2018-11-27 中文代码示例之Programming in Scala笔记第七八章

    续前文: 中文代码示例之Programming in Scala学习笔记第二三章 中文代码示例之Programming in Scala笔记第四五六章. 同样仅节选有意思的例程部分作演示之用. 源文档 ...

随机推荐

  1. Windows Python Extension Packages

    备注: 1.先要安装wheel库:pip install wheel 2.下载wheel,切换至下载路径,然后安装:pip install wheel库名.whl Windows Python Ext ...

  2. 【微信小程序】——rpx、px、rem等尺寸间关系浅析

    最近开发微信小程序,在写样式表的时候发现用PX的效果不太理想,而官方文档用rpx来做响应式布局单位,就仔细研究了下,在此做个小总结: 这里先引用官方定义的尺寸单位‘rpx’:可以根据屏幕宽度进行自适应 ...

  3. [Objective-C语言教程]错误处理(22)

    在Objective-C编程中,错误处理由Foundation框架中提供的NSError类提供处理. 与仅使用错误代码或错误字符串相比,NSError对象封装了更丰富且更具可扩展性的错误信息. NSE ...

  4. 干货 | Elasticsearch Nested类型深入详解(转)

    https://blog.csdn.net/laoyang360/article/details/82950393 0.概要在Elasticsearch实战场景中,我们或多或少会遇到嵌套文档的组合形式 ...

  5. 数学规划求解器lp_solve超详细教程

    前言 最近小编学了运筹学中的单纯形法.于是,很快便按奈不住跳动的心.这不得不让我拿起纸和笔思考着,一个至关重要的问题:如何用单纯形法装一个完备的13? 恰巧,在我坐在图书馆陷入沉思的时候,一位漂亮的小 ...

  6. PHP下的浮点运算不准的解决办法

    首先看一段代码: 首先看一段代码: <?php $a = 0.1; $b = 0.7; var_dump(($a + $b) == 0.8); 打印出来的值居然为 boolean false P ...

  7. window.open完美替代window.showModalDialog

    var url = "http//:www.baidu.com/" var name = "百度"; var iWidth = 1100;//弹窗宽度 var ...

  8. (原创推荐文章)kerberos服务器端与客户端

    #环境 两台装centos7的虚拟机即可. kerberos服务器端与客户端各一台 (本文档推荐使用Typora软件观看) # 1.kerberos服务器端配置 ## 1.1安装配置Kerberos ...

  9. Objective-C 之category

    参考资料:iOS设计模式——Category Category Category模式用于向已经存在的类添加方法从而达到扩展已有类的目的. 相当于Swift中的功能扩展(extension). 新添加的 ...

  10. Java类型简介

    1 java基本数据类型 1.1 基本数据类型 java的基础数据类型有多少个,每个在内存的分配是多少呢? 类型 分配字节 byte 1 short 2 char 2 int 4 long 8 ref ...