Scala

一.scala基础篇

数据类型:与java相似部分 这几个都为对象,无数据类型
Byte,Short,Int,Long,Float,Double,Char,String,Boolean
变量
常量:用val声明
变量:用var声明
访问修饰符:
private: 尽在包含了成员定义的类或对象内部可见
在嵌套类情况下,外层类甚至不能访问被嵌套类的私有成员
三.运算符
与Java一样
四.控制语句
if …else ,while,do…while与java无异
for循环不同
for形式定义

for(x <- Range ){
        statement(s);
}

Range可以是一个数字区间表示,i to j 左右全闭区间 , i until j 左闭右开
<- 用于为变量x赋值
双变量循环

object TestControlSentence {
  def main(args: Array[String]): Unit = {
    var end = 5;
    var begin = 1;
    for(x <- begin to end;j <- begin to end){
      println(x+"*"+j)
    }
  }
}

五.方法与函数
两者的区别
1.用val定义函数,def语句定义方法
2.方法是类的一部分,函数是一个对象,可以赋值给一个变量
方法的定义
定义格式

def functionName ([参数列表]) : [return type 返回值类型] = {
    function body
    return [expr]
}

不写等于号和方法主体,为抽象方法
无返回值,返回值类型可以写Unit
返回时可写return,也可以不写,不写则表示最后一个变量为返回值
参数可以逗号分割
方法的调用
调用说明
当不需要实例化对象时,functionName(参数列表)即可
当需要实例化对象时,为instance.functionName(参数列表)即可
六.闭包
概念
闭包是个函数
函数的计算过程,依赖于在函数外部的一个或者多个变量
七.字符串
概念介绍
在 Scala 中,字符串的类型实际上是 Java String,它本身没有 String 类。
完全与java.lang.String对等
可变字符串的创建(StringBuilder):

stringBuilder += '1'  stringBuilder ++= "234"   stringBuilder.append("567")

字符串的格式化printf:

printf("我是%s,我在%s,我做%s,我今年%d岁了",name,location,work,age);}

八.数组
静态数组:

var programLanguageArray = Array("java", "python", "c++", "c", "php")

动态数组:

var programLanguageArray = new Array[String](5) 
  programLanguageArray(0) = "java";

多维数组
多维数组(>=2)即为数组的数组,与Java中概念等同
数组中的元素即可以是实体的值,也可以是一个数组,且可以嵌套
数组合并

var numberList1 = Array(1, 2, 3, 4)
var numberList2 = Array(5, 6, 7, 8)
var mergeList = concat(numberList1, numberList2)

创建区间数组
range(start,end,step) 方法来生成一个区间范围内的数组
range(start,end,step) 方法最后一个参数为步长,默认为 1
是半包区间,包含起始值,不包括结束值,即start<=x<end
var numberList1 = range(1, 5, 2)

二.函数的高级应用

  1. 函数传名调用
    概念说明
    传值调用
    传值调用:先计算参数表达式的值,再应用到函数内部,把=>去掉即可,即按原始的方式
    传名调用:将未计算的参数表达式直接应用到函数内部,用=>来设置传名调用

  2. 指定函数参数名调用

  3. 可变参数的函数

  4. 默认参数值函数

  5. 递归函数

  6. 高阶函数
    概念说明
    第一种:将一个函数当做另外一个函数的参数,即参数为函数的函数
    第二种:返回值是函数的函数,即高阶函数可以产生函数

  7. 内嵌函数
    概念介绍
    函数内定义函数,定义在函数内的函数称之为局部函数,亦称内嵌函数

  8. 匿名函数
    概念介绍
    没有函数名称的函数
    使代码更简洁,用=>来表示,左侧是参数列表,右侧是函数体

  9. 偏应用函数
    概念说明
    不需要提供函数需要的所有参数,只需要提供部分,或不提供所需参数
    实现方法:绑定函数的一部分参数,非绑定部分用"_"代替,从而形成偏应用函数去使用

  10. 函数柯里化
    概念说明
    将原来接受两个参数的函数变成新的接受一个参数的函数的过程。新的函数返回一个以原有第二个参数为参数的函数。
    提高了使用方法的灵活性

三.scala进阶之集合

Scala List
类似于数组,要求所有元素的类型都相同,通过范型来约束
列表是不可变集合,一旦定义了就不能改变
列表具有递归定义的性质,可以嵌套定义,这是与数组最大的不一样。
 用Nil和::来构建列表 形成可变效果
• 常用操作
head 返回列表第一个元素
tail 返回一个列表,包含除了第一元素之外的其他元素
isEmpty 在列表为空时返回true
::: 运算符或 List.::😦) 方法或 List.concat() 方法来连接两个或多个列表
List.fill() 方法来创建一个指定重复数量的元素列表
List.tabulate() 方法是通过给定的函数来创建列表。
List.reverse 用于将列表的顺序反转

Scala Set(集合)
没有重复的对象集合,所有的元素都是唯一的
Set集合分为可变的和不可变的集合
默认使用不可变集合,完整类路径为:scala.collection.immutable.Set
若要引用可变集合类型,则类路径为:scala.collection.mutable.Set
• 常用操作
head 返回集合第一个元素
tail 返回一个集合,包含除了第一元素之外的其他元素
isEmpty 在集合为空时返回true
使用 ++ 运算符或 Set.++() 方法来连接两个集合
使用 Set.min 方法来查找集合中的最小元素,使用 Set.max 方法查找集合中的最大元素
使用 Set.& 方法或 Set.intersect 方法来查看两个集合的交集元素。

Scala Map(映射)
一种可迭代的键值对(key/value)结构,也称为哈希表
所有的值都可以通过键来获取,键值是唯一的
两种类型,可变与不可变,区别在于可变对象可以修改它,而不可变对象不可以
默认使用的不可变 Map,可变的Map需要使用import scala.collection.mutable.Map 类
• 常用操作
keys:返回 Map 所有的键(key)
values:返回 Map 所有的值(value)
isEmpty:在 Map 为空时返回true
使用++运算符或Map.++()方法来连接两个Map,Map合并时会移除重复的key。
通过foreach循环输出Map中的keys和values:
使用Map.contains方法来查看Map中是否存在指定的Key

Scala 元组
与列表相似,元组是不可变的
与列表不同的是,元组可以包含不同类型的元素
元组是通过"( )"来定义的

Scala Iterator(迭代器)
不是一个集合,它是一种用于访问集合的方法。
基本操作是hasNext和next
常用方法或属性
it.hasNext() 用于检测集合中是否还有元素。
it.next() 会返回迭代器的下一个元素,并且更新迭代器的状态
max:取得迭代器对应集合的最大值
min:取得迭代器对应集合的最小值
size/length:取得迭代器对应集合的长度

类和对象
类和对象通用说明
类是对象的抽象,而对象是类的具体实例。
类是抽象的,不占用内存,而对象是具体的,占用存储空间。
类是用于创建对象的模板,它定义包括在特定类型的对象中的方法和变量。
scala类和对象介绍
一个Scala源文件中可以有多个类。
类访问修饰符默认均是public的,并不需要声明
通过new来实例化类,生成相应的对象
类本身是不能作为程序主入口的,必须通过定义Object对象,该对象的main方法作为程序的主入口

单例模式
static在scala中是没有的,不符合纯面向对象的模型。
scala中使用object关键字来解决单例模式问题。object与类的区别是object不能够带参数。
scala经典版单例模式
伴生对象:除了定义的类之外,还要定义一个同名的 object 对象,当单例对象与某个类共享同一个名称时,他被称作是这个类的伴生对象:companion object
伴生类:该伴生对象对应的类,即为伴生类companion class
必须在同一个源文件里定义类和它的伴生对象
类和它的伴生对象可以互相访问其私有成员

四、特质trait

相当于Java的接口和抽象类的二合一,即可以当接口使用,也可以像抽象类去定义实际的方法和抽象方法去使用。
特质是支持多继承的,解决了scala单继承的问题,间接达到scala多继承的效果。
用关键字trait来定义特质

五、模式匹配

类比于java中的switch…case,但比其要强大、灵活很多。
旨在解决符合一定模式(值也是模式的一种)情况下的匹配与处理问题。

一个模式匹配包含了一系列备选项,每个都开始于关键字case。每个备选项都包含了一个模式及一到多个表达式。箭头符号=>隔开了模式和表达式。
选择器 match {备选项},match 表达式通过以代码编写的先后次序尝试每个模式来完成计算,只要发现有一个匹配的case,剩下的case不会继续匹配。

六、正则表达式

与Java当中的正则表达式的作用完全相同正则表达式,又称规则表达式。(英语:RegularExpression,在代码中常简写为regex、regexp或RE)通常被用来验证、检索、替换那些符合某个模式(规则)的文本。对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。
用"".r或是scala.util.matching 包中的 Regex 类实现对正则的支持抽象。

七、提取器(Extractor)

提取器是从传递给它的对象中提取出构造该对象的参数。
提取器是一个带有unapply方法的对象。unapply方法算是apply方法的反向操作:unapply接受一个对象,然后从对象中提取值,提取的值通常是用来构造该对象的值。
apply与unapply方法是互反的,apply用于构造一个对象,而不需要用new方法是其重要特点,unapply是反向解开这个对象,将其对应的参数值提取出来。

八、文件I/O

与Java基本类似
其文件写操作,直接用的都是 java中 的 I/O 类
增加了少部分新IO类,并对API中做了部分简化

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值