1.惰性加载:

在企业的大数据开发中,有时候会编写非常复杂的SQL语句,这些SQL语句可能有几百行甚至上千行。这些SQL语句,如果直接加载到JVM中,会有很大的内存开销。如何解决?

当有一些变量保存的数据较大时,但是不需要马上加载到JVM内存。可以使用惰性赋值来提高效率。

语法格式:

lazy val/var 变量名 = 表达式

2.scala提供多种定义字符串的方式,将来我们可以根据需要来选择最方便的定义方式。

  • 使用双引号 :   val/var 变量名 = “字符串”

  • 使用插值表达式(有效避免大量字符串的拼接): val/var 变量名 = s"${变量/表达式}字符串"

  • 使用三引号: 如果有大段的文本需要保存,就可以使用三引号来定义字符串。例如:保存一大段的SQL语句。三个引号中间的所有字符串都将作为字符串的值。

    val/var 变量名 = """字符串1
    字符串2"""

eg. val sql = """select
| *
| from
| t_user
| where
| name = "zhangsan""""

println(sql)

3. 运算符

  • scala中没有,++、--运算符

  • 与Java不一样,在scala中,可以直接使用==!=进行比较,它们与equals方法表示一致。而比较两个对象的引用值,使用eq

eg. val str1 = "abc"
val str2 = str1 + ""
str1 == str2    //true
str1.eq(str2)    //false

4.

val b:Int = null

scala会解释报错:

Null类型并不能转换为Int类型,说明Null类型并不是Int类型的子类

5. 条件表达式,与Java不一样,有返回值

在scala中,没有三元表达式,可以使用if表达式替代三元表达式

eg. val result = if(sex == "male") 1 else 0

块表达式
- scala中,使用{}表示一个块表达式
- 和if表达式一样,块表达式也是有值的
- 值就是最后一个表达式的值

6.中缀调用法: for(i <-  1 to 10) ...

7.嵌套循环:for(i <- 1 to 3; j <- 1 to 5) {print("*");if(j == 5) println("")}

8.break和continue

- 在scala中,类似Java和C++的break/continue关键字被移除了
- 如果一定要使用break/continue,就需要使用scala.util.control包的Break类的**breakable**和**break**方法。

实现break

**用法**

- 导入Breaks包`import scala.util.control.Breaks._`
- 使用breakable将for表达式包起来
- for表达式中需要退出循环的地方,添加`break()`方法调用

**示例**
使用for表达式打印1-100的数字,如果数字到达50,退出for表达式

**参考代码**

// 导入scala.util.control包下的Break
import scala.util.control.Breaks._
breakable{
for(i <- 1 to 100) {
if(i >= 50) break()
else println(i)
}
}

实现continue
**用法**
continue的实现与break类似,但有一点不同:
> 实现break是用breakable{}将整个for表达式包起来,而实现continue是用breakable{}将for表达式的循环体包含起来就可以了

**示例**

打印1-100的数字,使用for表达式来遍历,如果数字能整除10,不打印

// 导入scala.util.control包下的Break
import scala.util.control.Breaks._
for(i <- 1 to 100 ) {
breakable{
if(i % 10 == 0) break()
else println(i)
}
}

9.方法参数:

默认参数: 在定义方法时可以给参数定义一个默认值。
// x,y带有默认值为0
def add(x:Int = 0, y:Int = 0) = x + y
add() //0

带名参数: 在调用方法时,可以指定参数的名称来进行调用。
def add(x:Int = 0, y:Int = 0) = x + y
add(x=1) //1

变长参数: 如果方法的参数是不固定的,可以定义一个方法的参数是变长参数。
scala> def add(num:Int*) = num.sum
add(1,2,3,4,5) //15

10. 方法调用方式

在scala中,有以下几种方法调用方式,
- 后缀调用法
- 中缀调用法
- 花括号调用法
- 无括号调用法
在后续编写spark、flink程序时,我们会使用到这些方法调用方式。

后缀调用法:这种方法与Java没有区别。
对象名.方法名(参数)
scala> Math.abs(-1)
res3: Int = 1

中缀调用法:
**语法** 对象名 方法名 参数。
1 to 10
操作符即方法。
1 + 1
scala> Math abs -1 res4: Int = 1
> 如果有多个参数,使用括号括起来

花括号调用法
语法
Math.abs{
// 表达式1
// 表达式2
}
> 方法只有一个参数,才能使用花括号调用法
scala> Math.abs{
println("请绝对值")
-10
}
res13: Int = 10

无括号调用法:如果方法没有参数,可以省略方法名后面的括号。
def m3()=println("hello")
m3  //调用时不用加括号

11.方法和函数的区别

- 方法是隶属于类或者对象的,在运行时,它是加载到JVM的方法区中
- 可以将函数对象赋值给一个变量,在运行时,它是加载到JVM的堆内存中
- 函数是一个对象,继承自FunctionN,函数对象有apply,curried,toString,tupled这些方法。方法则没有

12.定长数组和变长数组:

# 定长数组:
- 定长数组指的是数组的**长度**是**不允许改变**的
- 数组的**元素**是**可以改变**的

// 通过指定长度定义数组
val/var 变量名 = new Array[元素类型](数组长度)
// 用元素直接初始化数组
val/var 变量名 = Array(元素1, 元素2, 元素3...)

# 变长数组:
变长数组指的是数组的长度是可变的,可以往数组中添加、删除元素
创建变长数组,需要提前导入ArrayBuffer类`import scala.collection.mutable.ArrayBuffer

创建空的ArrayBuffer变长数组,语法结构:
val/var a = ArrayBuffer[元素类型]()
创建带有初始元素的ArrayBuffer
val/var a = ArrayBuffer(元素1,元素2,元素3....)

13.for(i <- 0 until a.length) prinln(a(i))    //until关键字

14. val a = Array(1,2,3,4,5)

a.sum, a.max, a.min, a.sorted, a.sorted.reverse

15.元组

使用括号来定义元组
val/var 元组 = (元素1, 元素2, 元素3....)
使用箭头来定义元组(元组只有两个元素)
val/var 元组 = 元素1->元素2

注:如果用val修饰元组变量,则其里面的所有元素都是不能被重新赋值! 这点和数组不同。

16. 列表:

列表是scala中最重要的、也是最常用的数据结构。List具备以下性质:
- 可以保存重复的值
- 有先后顺序
在scala中,也有两种列表,一种是不可变列表、另一种是可变列表
不可变列表就是列表的元素、长度都是不可变的。
**语法**
使用`List(元素1, 元素2, 元素3, ...)`来创建一个不可变列表,语法格式:
val/var 变量名 = List(元素1, 元素2, 元素3...)
使用`Nil`创建一个不可变的空列表
val/var 变量名 = Nil
使用`::`方法创建一个不可变列表
val/var 变量名 = 元素1 :: 元素2 :: Nil
> 使用**::**拼接方式来创建列表,必须在最后添加一个Nil

17. list获取列表的前缀和后缀:

scala> val a = List(1,2,3,4,5)
a: List[Int] = List(1, 2, 3, 4, 5)

scala> a.take(3)
res56: List[Int] = List(1, 2, 3)

scala> a.drop(3)
res60: List[Int] = List(4, 5)

18.list拉链与拉开

  • 拉链:使用zip将两个列表,组合成一个元素为元组的列表

  • 拉开:将一个包含元组的列表,解开成包含两个列表的元组

scala> val a = List("zhangsan", "lisi", "wangwu")
a: List[String] = List(zhangsan, lisi, wangwu)
scala> val b = List(19, 20, 21)
b: List[Int] = List(19, 20, 21)
scala> a.zip(b)
res1: List[(String, Int)] = List((zhangsan,19), (lisi,20), (wangwu,21))

scala> res1.unzip
res6: (List[String], List[Int]) = (List(zhangsan, lisi, wangwu),List(19, 20, 21))

19.方法中的函数参数,如果该函数的参数在方法体中只出现一次,且没有其他的任何嵌套调用,则该函数的参数部分可以省略,且其表达式中用到参数时,可以用下划线代替。

20.println("-" * 15) ,结果:打印出来15个减号

21.当我们定义一个样例类,编译器自动帮助我们实现了以下几个有用的方法:

  • apply方法  // 不用new关键字,构建对象

  • toString方法  //eg. Person(张三,20)

  • equals方法  //比较2个对象的所有成员变量是否相等(如果比较引用是否相等,用eq)

  • hashCode方法

  • copy方法  //可使用带名参数拷贝一个对象的所有成员变量到另一个对象。

22. 非变、协变、逆变:详见代码

23.方法格式和函数格式:

方法:  def 方法名(参数:参数类型, 参数:参数类型 ...) : 返回值类型 = { 方法体 }

函数:  val/var 函数变量名 : 【(参数类型, 参数类型, ...) => 返回值类型】 = (参数:参数类型, 参数:参数类型 ...) => { 函数体 }   //函数可以省略返回值类型,scala会根据函数体自动判断,即 红色字体部分可以省略;如果函数体只有一个表达式,可省略花括号。

方法可以转化为函数,反过来不行:  eg. val func = add _  //将add方法转化为函数,赋值给变量func

eg1. val func: Int => String = (num:Int) => "*" * num  //用于将数字转换为指定个数的小星星

eg2. scala> var func2 : (Int,Int) => String = (x:Int,y:Int) => x+y+"a"  //红色字体部分可以省略

    func2: (Int, Int) => String = <function2>

24.scala的actors和akka的actors的区别:

首先actor模型是处理高并发问题的,Akka actors和Scala actors是该模型的两个实现,

akka是另一个独立的actor, 比scala自带的强大的多, 当然也是scala写的,

在生产过程中大多数都是使用akka中的actor模型。
 
 

Update(Stage4):scala补充知识的更多相关文章

  1. 多表查询思路、navicat可视化软件、python操作MySQL、SQL注入问题以及其他补充知识

    昨日内容回顾 外键字段 # 就是用来建立表与表之间的关系的字段 表关系判断 # 一对一 # 一对多 # 多对多 """通过换位思考判断""" ...

  2. 031医疗项目-模块三:药品供应商目录模块——供货商药品目录查询功能----------sql补充知识

    这个补充知识有一个点很有必要,视屏上的老师提出一点: 内链接关联查询: 如果表A和表B有一个外键关联 ,可以通过外键进行内链接查询 select dictinfo.*, dicttype.typena ...

  3. 面向对象 - 1.面向过程/2.面向对象/3.如何使用类/4.__init__方法/5.属性查找/6.补充知识/7.可扩展性高

    编程范式(流派): 面向对象编程,面向过程编程 各有用处!! 编程:语法+数据结构(list dict)+算法(逻辑)-----------------------------------1.面向过程 ...

  4. freeMarker(五)——模板开发指南补充知识

    学习笔记,选自freeMarker中文文档,译自 Email: ddekany at users.sourceforge.net 模板开发指南补充知识 1. 自定义指令 自定义指令可以使用 macro ...

  5. sql系列(基础篇)-前言 课前补充知识

    前言 课前补充知识 Number(p,s) Number(p,s):数字类型,p 表示数字的有效长度(从数字的左边第 1 位不为 0 的開始算起,直到最右边的长度.取值范围 0~38 位),s 表示数 ...

  6. 10.11 android输入系统_补充知识_activity_window_decor_view关系

    android里:1个application, 有1个或多个activity(比如支付宝有:首页.财富.口碑.朋友.我的,这些就是activity)1个activity, 有1个window(每个ac ...

  7. 8.6 day27 网络编程 osi七层协议 Time模块补充知识 TCP协议

    Time模块补充知识 date和datetime区别是什么? date 就是年月日 datetime就是年月时时分秒 以下代码为什么会报错? import json from datetime imp ...

  8. 范仁义html+css课程---11、html补充知识

    范仁义html+css课程---11.html补充知识 一.总结 一句话总结: 小于号(<):< 大于号(>):> 空格:  二.html 字符实体 1.小于号(<)和大 ...

  9. Pthon面向对象-补充知识

    Pthon面向对象-补充知识 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.tracemalloc 标准库tracemalloc,可以统计内存使用情况,通过下面的案例可以看出内 ...

随机推荐

  1. Jarvis OJ - Baby's Crack - Writeup

    Jarvis OJ - Baby's Crack - Writeup M4x原创,欢迎转载,转载请表明出处 这是我第一次用爆破的方法做reverse,值得记录一下 题目: 文件下载 分析: 下载后解压 ...

  2. hdu 1045 Fire Net(二分图)

    题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=1045 题目大意为给定一个最大为4*4的棋盘,棋盘可以放置堡垒,处在同一行或者同一列的堡垒可以相互攻击, ...

  3. Pandas 数据分析——超好用的 Groupby 详解

    在日常的数据分析中,经常需要将数据根据某个(多个)字段划分为不同的群体(group)进行分析,如电商领域将全国的总销售额根据省份进行划分,分析各省销售额的变化情况,社交领域将用户根据画像(性别.年龄) ...

  4. 【红黑树】的详细实现(C++)

    红黑树的介绍 红黑树(Red-Black Tree,简称R-B Tree),它一种特殊的二叉查找树.红黑树是特殊的二叉查找树,意味着它满足二叉查找树的特征:任意一个节点所包含的键值,大于等于左孩子的键 ...

  5. POJ2909_Goldbach's Conjecture(线性欧拉筛)

    Goldbach's Conjecture: For any even number n greater than or equal to 4, there exists at least one p ...

  6. 虚拟机安装的ubuntu不能联网解决

    安装双系统从没遇到的问题,再虚拟机上遇到了不能联网的问题: 下面给出我的解决方法(win10系统.ubuntu 16.04) 我的电脑-管理-设备管理器 看是否虚拟机的虚拟网卡在: 在去设置-控制面板 ...

  7. PHP基础学习笔记3

    一.检索表单信息 PHP 中的 $_GET 和 $_POST 变量用于检索表单中的信息,比如用户输入 提交的表单: <form action="welcome.php" me ...

  8. javacript onclick事件中传递参数

    var user = {id:1, name:'zhangsan'}; var object = '<a onclick="conversion(' + JSON.stringify( ...

  9. 原生JS实现旋转木马轮播图特效

    大概是这个样子: 首先来简单布局一下(emm...随便弄一下吧,反正主要是用js来整的) <!DOCTYPE html> <html lang="en"> ...

  10. Linux03——磁盘分区和挂载

    Windows下的磁盘分区: 常用的两种磁盘分区类型 mbr: 操作系统安装在主分区 只支持4个主分区 拓展分区占一个主分区 gpt(win7 64位之后) 无限主分区 支持超大硬盘3T以上 查看所有 ...