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. cesium编程中级(一)添加示例到Sandcastle

    cesium编程中级(一)添加示例到Sandcastle 添加示例到Sandcastle在cesium编程入门(七)3D Tiles,模型旋转中提到过,这里是一份完整的说明 创建例子 开启node服务 ...

  2. cesium编程入门(四)界面介绍及小控件隐藏

    感性认识 界面介绍,viewer Geocoder : 查找位置工具,查找到之后会将镜头对准找到的地址,默认使用bing地图 Home Button :视角返回初始位置. Scene Mode Pic ...

  3. C#基础笔记(第十六天)

    1.进程复习//通过进程去打开应用程序 Process.Start("calc"); Process.Start("mspaint"); Process.Sta ...

  4. iOS View 外层奇怪的黑线

    最近碰到一个问题,当时是为了建了一个能自动适应内容的 Label.根据内容,我计算出需要的尺寸,然后把新尺寸设置给 Label. 但是显示的时候,一个奇怪的现象出现了,Label 的顶端总是有一条浅浅 ...

  5. 使用Anaconda的python安装虚拟环境是出现错误:python -m venv venvdir----Error: Command '['D:\\Development\\Django\\test\\Scripts\\python.exe', '-Im', 'ensurepip', '--upgrade', '--default-pip']' returned non-zero exit

    在创建python虚拟环境的时候,如果使用的是Anaconda中集成的python -m venv venvdir就会出现不能安装pip的错误,原因是Anaconda没有ensurepip, 解决办法 ...

  6. ASPNETPager常用属性(近来用到分页属性)

    ASPNETPager常用属性 建议去封装好,然后调用这样比较容易 <webdiyer:aspnetpager id="AspNetPager1" runat="s ...

  7. C语言 一些算法

    1,斐波那契数列 ①递归 时间复杂度O(2^n)#include <stdio.h> int fib(int n){ ||n==) ; ) + fib(n-); } int main(){ ...

  8. docker微服务部署之:一,搭建Eureka微服务项目

    先说明一下docker需要搭建的微服务的基本情况: 项目情况:一个demo_parent项目,下面三个子模块:demo_eureka(eureka服务).demo_article(文章服务).demo ...

  9. Xcode 工程文件“.xcodeproj”文件夹解析

    项目.xcodeproj 文件夹底下一般有4个文件: project.pbxproj 文件 xcuserdata 文件夹 xcshareddata 文件夹 project.xcworkspace 文件 ...

  10. vue封装插件并发布到npm上

    vue封装插件并发布到npm上 项目初始化 首先,要创建项目,封装vue的插件用webpack-simple很合适,vue init webpack-simple 项目名称此命令创建我们的项目的目录, ...