开发者学堂课程【Scala 核心编程 - 进阶:流】学习笔记,与课程紧密连接,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/610/detail/9061
流
内容介绍:
一、流的基本介绍
二、流的简单运用
三、对流的小结
一、流的基本介绍
1.基本说明
流是数据,就像流水一样源源不断、无穷,是一个集合。也叫 Stream 。
Stream 这个集合,可以用于存放无穷多个元素,但是这无穷多个元素并不会一次性生产出来,当你需要的时候,才会产生一个你需要的数据,而且产生的数据是可以先规定一个规则的,这个规则类似于 lazy 规则,而是需要用到多大的区间,就会动态的生产,末尾元素遵循 lazy 规则(lazy 规则是加载或者惰性的,即:要使用结果才进行计算的)。
2.创建 Stream 对象
案例一:
def numsForm(n: BigIht) : Stream[BigIht] = n #:: numsForm(n+1)
val stream1 = numsForm(1)
其中 numsForm(n:BigIht) 中有一个 BigIht 函数,这个函数会产生一个Stream,并且 Stream 这个流对象里面存放了一个BigIht ,其产生的规则就是 n+1 ,一次增加一个,
详情可见如下说明:
(1)Stream 集合存放的数据类型是BigIht
(2) numsForm 是自定义的一个函数,函数名是程序员指定的。
(3)创建的集合的第一个元素是 n (即程序员先输入一个数据,于是创建的初始值就是这个数据),后续元素生成的规则是 n+1(这个规则可以由程序员自行进行变化,目的是为了让流在使用的时候自动的产生一个末尾的元素)
(4)后续元素生成的规则是可以程序员指定的,比如 numsForm( n * 4)...
二、流的简单运用
1.案例二
给出以下代码
使用 tall ,会动态的向 stream 集合按规则生成新的元素
//创建 Stream
def numsForm(n: BigIht) : Stream[Bight] = n #:: numsForm(n+1)
val stream1 = numsForm(1)
println(stream1)//
//取出第一个元素
println(“head=” + stream1.head)//
println(stream1.tail) //
println(stream1) //?
在这段程序中, numsForm(1) 表示第一次输入数据1,println(stream1)// 表示输出 stream 这个流,
而 stream1.head 表示取出这个流的第一个元素也就是 head ,再用 tail 取出尾部的元素,最后再输入流
注意:
如果使用流集合,就不能使用 last 属性(如果使用 last 集合会取最后一个元素,自动的触发函数),就会进行无限循环。
2.案例三
以下是命名为 StreamDemo01 类型为 object 的一段代码
package com.atguigu.chapter11
obiect StreamDeemo01 {
def main(args: Array[String]): Unit = {
//创建 Stream
def numsForm(n: BigIht) : Stream[BigIht] = n#:: numsForm(n+1)
val stream1 = numsForm(1)
println(stream1) //
//取出第一个元素
println(“head=” + stream1.head) //
printin(stream1.tail) //
println(stream1) //?
}
}
可以看到,流是一个集合,于是第一次产生的是 numsForm(1) 也就是1,后面产生的未输出,可以用...表示。
当取出第一个元素也就是1之后,而取 tail 取到尾部后会自动再次出发,此时会产生一个新的元素(根据 n+1 规则产生)也就是2,后面产生的同样可以用...表示。
运行此代码,可以看到结果,除...被?代替,其他与上述说明相同,且 stream1 输出的是1,2,?
3.案例四(应用案例)
使用 map 映射 stream 的元素并进行一些计算
//创建 Stream
def numsForm(n: BigIht) : Stream[BigIht] = n#:: numsForm(n+1)
def multi(x:BigInt) : BigInt = {
x * x
}
println(numsForm(5).map(multi)) //?
以上代码中增加了 def multi(x:BigInt) 以及 x * x 即 x 与 x 相乘,相乘后,由于产生的是一个集合,如果这个集合是多个,使用 map ,也会产生多个;如果这个集合是一个,那么只会产生一个。
numsForm(5) 表示产生了一个流,并且这个流只有一个元素5,而使用 map 对流进行了映射的操作,把流里面所有的数据也就是5取出来再乘以5后返回,产生25,后面产生的可以用 ?表示。
运行此代码,可以看到结果与以上说明大致相同。如果流的数据有多个,使用 map 会对流里面所有的数据进行 x * x 后返回的操作。
三、对代码的小结
1.对流的基本认识
流的主要作用是可以产生和存放无穷多个数据的一个集合,产生的集合中末尾元素遵循 lazy 规则(即需要才会产生,不需要不会产生)。
2.产生流对象的简单说明
创建流对象:通过四个案例进行了说明
其中:
(1)案例一的规则是 n+1 ,做测试大数据时可以用案例一的流来设计案例。
(2)案例二中使用了 tail ,使用 tail 才会产生新元素,如果不使用 tail 不会产生新元素,即当对流执行了 tail 操作后,会产生一个新的数据。